Entfernen von nachgestellten Nullen aus BigDecimal in Java

Lesezeit: 3 Minuten

Benutzer-Avatar
Sehr klein

Ich muss nachgestellte Nullen aus entfernen BigDecimal zusammen mit RoundingMode.HALF_UP. Zum Beispiel,

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() funktioniert, aber es gibt wissenschaftliche Notationen in Situationen wie

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

In diesem Fall kehrt es zurück 6E+2. Ich brauche dies in einem benutzerdefinierten Konverter in JSF, wo es für Endbenutzer hässlich sein könnte. Also, was ist der richtige Weg, dies zu tun?

Benutzer-Avatar
Adrian Adamczyk

Verwenden toPlainString()

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

Ich bin (noch) nicht in JSF, aber der Konverter könnte so aussehen:

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

und dann in xhtml:

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

Benutzer-Avatar
Cornel B

Beachten Sie, dass stripTrailingZeros() geht auch nicht so gut.

Dazu:

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

Ausgabe (Java 7):

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

Ausgabe (Java 8):

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

Das 0.0000 Das Problem in Java 7 wird in Java 8 wie folgt behoben Java-Fix.

  • Das hat bei mir funktioniert. Die 0,0000-Beträge sind immer noch seltsam, aber es bereinigt den Rest der möglichen Werte davon, dass ~dp-Werte von 0 dahinterstehen, wenn die angeforderte Genauigkeit geringer als verfügbar ist.

    – Glenn.nz

    25. Juni 2014 um 2:27 Uhr

  • Nicht das, was ich gefunden habe … Ihr erstes Beispiel zum Entfernen von Nullen aus “0.0000” ergibt “0” sowohl mit “toString()” als auch mit “toPlainString()”. Machen wir etwas anders? ideone.com/fjS4qE

    – Nateowami

    19. September 2015 um 13:27 Uhr

  • Java 8 behebt einen Fehler, daher ist das erste Beispiel „0“ (das Verhalten von Java 7 ist „0.0000“).

    – Rauben

    27. April 2016 um 15:16 Uhr

Wenn Sie dies an Ihrem BigDecimal-Objekt tun und es nicht mit einem Formatierer in einen String konvertieren möchten, können Sie dies in Java 8 mit 2 Schritten tun:

  1. stripTrailingZeros()
  2. if scale < 0 setScale to 0 if not like esponential/scientific notation

Sie können dieses Snippet ausprobieren, um das Verhalten besser zu verstehen

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

  • Das hat bei mir gut funktioniert. BigDecimal setzt die Skala auf negative Werte, wenn die wissenschaftliche Notation verwendet wird.

    – Uwe Allner

    8. Februar 2019 um 13:53 Uhr

Benutzer-Avatar
HerrLore

Sie können dies auch mit erreichen String.format()so:

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

Sie sollten eine Berechnung mit BigDecimal durchführen und dann die Hälfte aufrunden, z

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

Es hat für mich funktioniert.

Benutzer-Avatar
Liem Nguyen

Sie können verwenden Dezimalformat. Zum Beispiel:

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

Bitte versuchen Sie es selbst.

1186550cookie-checkEntfernen von nachgestellten Nullen aus BigDecimal in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy