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 ()?

res1
fuente

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);
res1
fuente
¿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)
Federico Cattozzi
fuente
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);
}
Paramesh Korrakuti
fuente
12

Utilice stripTrailingZeros().

Este artículo debería ayudarte.

lrAndroid
fuente
3

Si su uso de dinero:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
Heisenberg
fuente