Wie drucke ich formatierte BigDecimal-Werte?


104

Ich habe ein BigDecimalFeld , amountdas Geld repräsentiert, und ich brauche seinen Wert im Browser in einem Format wie zu drucken $123.00, $15.50, $0.33.

Wie kann ich das machen?

(Die einzige einfache Lösung , die ich selbst sehen wird immer floatValueaus BigDecimalund dann mit NumberFormatmachen zweistelliger Präzision für den Bruchteil).

Antworten:


134
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

Es wird die aktuelle Standardeinstellung Ihrer JVM verwenden Locale, um Ihr Währungssymbol auszuwählen. Oder Sie können eine angeben Locale.

NumberFormat.getInstance(Locale.US)

Weitere Informationen finden Sie unter NumberFormatKlasse.


Ist es möglich, ein Muster genau wie bei DecimalFormat anzugeben?
Philippe Gioseffi

70

Angenommen , 123,456.78Sie müssen DecimalFormat verwenden, um das Tausendertrennzeichen festzulegen :

     DecimalFormat df = new DecimalFormat("#,###.00");
     System.out.println(df.format(new BigDecimal(123456.75)));
     System.out.println(df.format(new BigDecimal(123456.00)));
     System.out.println(df.format(new BigDecimal(123456123456.78)));

Hier ist das Ergebnis:

123,456.75
123,456.00
123,456,123,456.78

Obwohl ich die #,###.00Maske festgelegt habe, werden auch die längeren Werte erfolgreich formatiert. Beachten Sie, dass das Komma-Trennzeichen im Ergebnis von Ihrem Gebietsschema abhängt. Es kann nur Leerzeichen () für das russische Gebietsschema sein.


19
Wenn Sie möchten, dass Null als 0,00 (anstelle von 0,00) angezeigt wird, verwenden Sie "#,##0.00"stattdessen das Muster .
Jonik

35

Ein anderer Weg, der für die gegebene Situation sinnvoll sein könnte, ist

BigDecimal newBD = oldBD.setScale(2);

Ich sage das nur, weil es in einigen Fällen keinen Sinn macht, wenn Geld über 2 Dezimalstellen hinausgeht. Wenn Sie noch einen Schritt weiter gehen, könnte dies dazu führen

String displayString = oldBD.setScale(2).toPlainString();

Ich wollte jedoch nur die setScale-Methode hervorheben (die auch ein zweites Rundungsmodusargument verwenden kann, um zu steuern, wie diese letzte Dezimalstelle behandelt wird. In einigen Situationen zwingt Java Sie, diese Rundungsmethode anzugeben).


13
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// druckt 3.14

System.out.printf("%.0f",pi4);

// druckt 13


6

Ähnlich wie bei der Antwort von @Jeff_Alieffson, jedoch ohne Standard Locale:

Verwendung DecimalFormatSymbolsfür explizites Gebietsschema:

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));

Oder explizite Trennzeichen:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');

Dann:

new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));

Ergebnis:

12 345.00

1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
Sollte BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString () sein
Jeff Tsay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.