¿Cómo imprimir valores BigDecimal formateados?

104

Tengo un BigDecimalcampo amountque representa el dinero, y tengo que imprimir su valor en el navegador en un formato como $123.00, $15.50, $0.33.

¿Cómo puedo hacer eso?

(La única solución simple que veo yo es conseguir floatValuea partir BigDecimaly después usar NumberFormatpara hacer una precisión de dos dígitos para la parte fraccionaria).

romano
fuente

Respuestas:

135
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

Utilizará el valor predeterminado actual de su JVM Localepara elegir su símbolo de moneda. O puede especificar un Locale.

NumberFormat.getInstance(Locale.US)

Para obtener más información, consulte la NumberFormatclase.

Luca Molteni
fuente
¿Es posible especificar un patrón como lo hace DecimalFormat?
Philippe Gioseffi
71

Para establecer un separador de miles, digamos 123,456.78que debe usar DecimalFormat :

     DecimalFormat df = new DecimalFormat("#,###.00");
     System.out.println(df.format(new BigDecimal(123456.75)));
     System.out.println(df.format(new BigDecimal(123456.00)));
     System.out.println(df.format(new BigDecimal(123456123456.78)));

Aquí está el resultado:

123,456.75
123,456.00
123,456,123,456.78

Aunque configuré la #,###.00máscara, también formatea con éxito los valores más largos. Tenga en cuenta que el separador de coma (,) en el resultado depende de su configuración regional. Puede ser solo espacio () para la configuración regional rusa.

Jeff_Alieffson
fuente
19
Si prefiere que cero se muestre como 0.00 (en lugar de .00), use el patrón en su "#,##0.00"lugar.
Jonik
35

Otra forma que podría tener sentido para la situación dada es

BigDecimal newBD = oldBD.setScale(2);

Solo digo esto porque en algunos casos cuando se trata de dinero que va más allá de 2 lugares decimales no tiene sentido. Llevando esto un paso más allá, esto podría llevar a

String displayString = oldBD.setScale(2).toPlainString();

pero simplemente quería resaltar el método setScale (que también puede tomar un segundo argumento de modo de redondeo para controlar cómo se maneja ese último decimal. En algunas situaciones, Java te obliga a especificar este método de redondeo).

demongolem
fuente
14
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// imprime 3.14

System.out.printf("%.0f",pi4);

// imprime 13

Fluch
fuente
6

Similar a la respuesta de @Jeff_Alieffson, pero sin depender del valor predeterminado Locale:

Usar DecimalFormatSymbolspara configuración regional explícita:

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));

O símbolos de separación explícitos:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');

Luego:

new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));

Resultado:

12 345.00
volkovs
fuente
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
fuente
1
Debe ser BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay