java - castear - La mejor manera de convertir String específica de cadena a BigDecimal
string to bigdecimal java 7 (3)
Tengo que convertir una cadena alemana con formato de cadena a BigDecimal. Sin embargo, estoy luchando con la mejor solución.
El siguiente código muestra mi problema:
String numberString = "2.105,88";
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
Number parsed = nf.parse(numberString);
BigDecimal bd1 = new BigDecimal(parsed.toString());
System.out.println(bd1.toString());
BigDecimal bd2 = new BigDecimal(parsed.doubleValue());
System.out.println(bd2);
BigDecimal bd3 = new BigDecimal(numberString);
System.out.println(bd3);
} catch (ParseException e) {
e.printStackTrace();
}
La salida de esto es
2105.88
2105.8800000000001091393642127513885498046875
Excepción en el hilo "main" java.lang.NumberFormatException en java.math.BigDecimal. (Fuente desconocida) en java.math.BigDecimal. (Fuente desconocida) en test.BigDecimalTest.main (BigDecimalTest.java:22)
La primera salida es correcta, pero realmente no tiene sentido convertir una String
en un Number
( Double
para ser preciso), luego volver a una String
nuevamente y luego a un tipo específico de Number
, BigDecimal
.
La segunda salida es incorrecta, pero podría resolverse configurando la escala de BigDecimal. Sin embargo, la cantidad de dígitos no siempre se conoce.
La tercera salida obviamente no es lo que estoy buscando.
Mi pregunta, ¿cuál sería la mejor manera? ¿Hay mejores maneras de hacer esto?
El problema es el formato de su cadena. Debería ir con el tercer método, pero formatee su cadena de la siguiente manera: String numberString = "2105.88";
Podrá ver esto a partir de los ejemplos dados aquí: Enlace a Java Api
Edit: Ok, entonces veo 2 posibles soluciones para esto. Ve con tu solución 1 (eso es lo que prefiero) o haz algo como:
numberString = numberString.replaceAll(".", "");
numberString = numberString.replaceAll(",", ".");
BigDecimal bd3 = new BigDecimal(numberString);
Parece que no hay otra manera desde que java.Lang.Number no tiene un método que devuelva un tipo BigDecimal. De todos modos, tiene sentido porque BigDecimal solo acepta cadenas con el formato correcto, no como "" 2.105,88 "sino como" 2105.88 ". Permítame mostrarle mi código:
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class JavaMain {
public static void main(String[] args) {
String numberString = "2.105,88";
//using casting
try {
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
df.setParseBigDecimal(true);
BigDecimal bd = (BigDecimal) df.parseObject(numberString);
System.out.println(bd.toString());
} catch (ParseException e) {
e.printStackTrace();
}
//your way short version
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
System.out.println(bd1.toString());
} catch (ParseException e) {
e.printStackTrace();
}
String numberStringFixed = "2105.88";
//direct string formated
System.out.println(new BigDecimal(numberStringFixed));;
//direct but erroneous way if the string is not formated
System.out.println(new BigDecimal(numberString));;
}
}
¡Espero que esto ayude!
DecimalFormat
tiene un método llamado setParseBigDecimal
que hace que parse()
devuelva un BigDecimal
. Solo necesitas lanzar el Number
devuelto.