Naloopnullen verwijderen uit BigDecimal in Java

Ik moet de nullen aan het einde van BigDecimalsamen met RoundingMode.HALF_UPverwijderen. Bijvoorbeeld,

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()werkt, maar geeft wetenschappelijke notaties terug in situaties zoals,

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

In dit geval wordt 6E+2geretourneerd. Ik heb dit nodig in een aangepaste converter in JSF, waar het voor eindgebruikers lelijk kan zijn. Dus, wat is de juiste manier om dit te doen?


Antwoord 1, autoriteit 100%

Gebruik toPlainString()

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

Ik ben (nog) geen fan van JSF, maar de converter zou er zo uit kunnen zien:

@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();
    }
}

en dan in xhtml:

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

Antwoord 2, autoriteit 43%

Merk op dat stripTrailingZeros()doet het ook niet zo goed.

Hierover:

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

Uitvoer (Java 7):

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

Uitvoer (Java 8):

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

Het 0.0000probleem in Java 7 is opgelost in Java 8 door het volgende java-oplossing.


Antwoord 3, autoriteit 10%

Als je dit op je BigDecimal-object wilt doen en het niet wilt converteren naar een String met een formatter, kun je dit in Java 8 doen in 2 stappen:

  1. stripTrailingZeros()
  2. als schaal < 0 stelScale in op 0 als u niet van esponentiële/wetenschappelijke notatie houdt

U kunt dit fragment proberen om het gedrag beter te begrijpen

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

Antwoord 4, autoriteit 5%

Je kunt dit ook bereiken met String.format(), zoals zo:

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

Antwoord 5

U moet een berekening maken op de BigDecimal en deze vervolgens half naar boven afronden, bijvoorbeeld

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

Het werkte voor mij.


Antwoord 6

Je kunt DecimalFormatgebruiken.
Bijvoorbeeld:

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

Probeer het zelf.

Other episodes