web-dev-qa-db-fra.com

Supprimer les zéros de fin de BigDecimal en Java

Je dois supprimer les zéros de fin de BigDecimal avec RoundingMode.HALF_UP. Par exemple,

Value        Output

15.3456  <=> 15.35
15.999   <=> 16            //No trailing zeros.
15.99    <=> 15.99
15.0051  <=> 15.01
15.0001  <=> 15           //No trailing zeros.
15.000000<=> 15           //No trailing zeros.
15.00    <=> 15           //No trailing zeros.

stripTrailingZeros() fonctionne mais renvoie des notations scientifiques dans des situations telles que,

new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();

Dans ce cas, il retourne 6E+2. J'ai besoin de cela dans un convertisseur personnalisé dans JSF, où il pourrait être moche pour les utilisateurs finaux. Alors, quelle est la bonne façon de faire cela?

47
Tiny

Utilisez toPlainString()

BigDecimal d = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
System.out.println(d.toPlainString()); // Printed 600 for me

Je ne suis pas (encore) dans JSF, mais convertisseur peut ressembler à ceci

@FacesConverter("bigDecimalPlainDisplay")
public class BigDecimalDisplayConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        throw new BigDecimal(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        BigDecimal  bd = (BigDecimal)value;
        return bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
    }
}

puis en xhtml:

<h:inputText id="bigDecimalView" value="#{bigDecimalObject}" 
    size="20" required="true" label="Value">
    <f:converter converterId="bigDecimalPlainDisplay" />
</h:inputText>
56
Adrian Adamczyk

Notez que stripTrailingZeros() ne fait pas très bien non plus.

Sur ce:

val = new BigDecimal("0.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

val = new BigDecimal("40.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

val = new BigDecimal("40.50000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

Sortie (Java 7):

0.0000: plain=0.0000
4E+1: plain=40
40.5: plain=40.5

Sortie (Java 8):

0: plain=0
4E+1: plain=40
40.5: plain=40.5

Le problème 0.0000 dans Java 7 est résolu dans Java 8 par le correctif Java suivant .

23
Cornel B

Vous pouvez également accomplir ceci avec String.format() , comme suit:

final BigDecimal b = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP);
String f = String.format("%.0f", b);
System.out.println(f); //600
4
MrLore

Vous devez effectuer des calculs sur BigDecimal, puis les arrondir de moitié, par exemple.

    BigDecimal toPay = new BigDecimal(1453.00005);
    toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)

Cela a fonctionné pour moi.

1
TomekLach

Si vous voulez faire cela sur votre objet BigDecimal et ne pas le convertir en chaîne avec un formateur, vous pouvez le faire sur Java 8 en 2 étapes:

  1. stripTrailingZeros ()
  2. si scale <0 setScale à 0 si vous n'aimez pas la notation esponentielle/scientifique

Vous pouvez essayer cet extrait pour mieux comprendre le comportement

BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50.2
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//5E+1
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//50.2
1
Antonio Giordano

Vous pouvez utiliser DecimalFormat . Par exemple:

BigDecimal value = new BigDecimal("15.3456").setScale(2, BigDecimal.ROUND_HALF_UP));
String valueString = new DecimalFormat("#.##").format(value);
System.out.println(valueString); //15.35

S'il vous plaît essayez vous-même.

0
Liem Nguyen