Formatee un BigDecimal como una cadena con un máximo de 2 dígitos decimales, eliminando 0 en la parte decimal


80

Tengo un número BigDecimal y considero solo 2 lugares decimales, así que lo trunco ​​usando:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN)

Ahora quiero imprimirlo como String pero quitando la parte decimal si es 0, por ejemplo:

1,00 -> 1

1,50 -> 1,5

1,99 -> 1,99

Intenté usar un formateador, formatter.format pero siempre obtengo los 2 dígitos decimales.

¿Cómo puedo hacer esto? ¿Quizás esté trabajando en la cadena de bd.toPlainString ()?

Respuestas:


103

Usé DecimalFormat para formatear el BigDecimal en lugar de formatear el String, parece que no hay problemas con él.

El código es algo como esto:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN);

DecimalFormat df = new DecimalFormat();

df.setMaximumFractionDigits(2);

df.setMinimumFractionDigits(0);

df.setGroupingUsed(false);

String result = df.format(bd);

¿Cuál es el resultado esperado para este programa? Tengo los mismos requisitos para los ceros finales después del punto decimal, pero los ceros finales como .00 se truncan en la salida.
Paramesh Korrakuti

1
@ParameshKorrakuti df.setMinimumFractionDigits(2)funciona bien sin setScale y setGrouping y setMaxFrac.
Andrew Grinder

4
El formato decimal es NumberFormat disfrazado. Usar NumberFormat numberFormat = NumberFormat.getPercentInstance();luego numberFormat.setMinimumFractionDigits(2);entoncesString percent = numberFormat.format(yourBigDecimal);
Andrew Grinder

1
Java 9 y BigDecimal.ROUND_DOWNversiones posteriores están en desuso. Úselo en su RoundingMode.DOWNlugar.
Dilantha

69
new DecimalFormat("#0.##").format(bd)

42
Utilizo new DecimalFormat("0.00")si quiero asegurarme de que los dos lugares decimales se muestren siempre, por ejemplo, 1000.5se mostrarán como 1000.50.
Chris Parton

1
La solución de @ ChrisParton funciona perfectamente, además de que si alguien requiere aplicar la localización, podemos usar la siguiente lógica. import java.math.BigDecimal; import java.text.*; public class LocalizeExample { public static void main(String[] args) { BigDecimal bd = new BigDecimal("123.10"); DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(Locale.GERMAN); decimalFormat.applyPattern("#0.00"); String result = decimalFormat.format(bd); System.out.println(result); } }
Paramesh Korrakuti

14

El siguiente código puede ayudarlo.

protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
    final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
    numberFormat.setGroupingUsed(true);
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);
    return numberFormat.format(input);
}


3

Si su uso de dinero:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.