setparsebigdecimal convertir castear cast java bigdecimal

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.