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).

römisch
quelle

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.

Luca Molteni
quelle
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.

Jeff_Alieffson
quelle
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).

Demongolem
quelle
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

Fluch
quelle
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
volkovs
quelle
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
quelle
1
Sollte BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString () sein
Jeff Tsay