Jak wydrukować sformatowane wartości BigDecimal?


104

Mam BigDecimalpole amount, które reprezentuje pieniądze i muszę wydrukować swoją wartość w przeglądarce w takim formacie jak $123.00, $15.50, $0.33.

Jak mogę to zrobić?

(Tylko proste rozwiązanie, które widzę siebie robi floatValuez BigDecimal, a następnie używając NumberFormatdo dwucyfrowego precyzji dla części frakcji).

Odpowiedzi:


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

Użyje bieżącej domyślnej maszyny JVM, Localeaby wybrać symbol waluty. Lub możesz określić Locale.

NumberFormat.getInstance(Locale.US)

Aby uzyskać więcej informacji, zobacz NumberFormatzajęcia.


Czy można określić wzorzec, tak jak robi to DecimalFormat?
Philippe Gioseffi

71

Aby ustawić separator tysięcy, powiedz, że 123,456.78musisz użyć DecimalFormat :

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

Oto wynik:

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

Chociaż ustawiłem #,###.00maskę, z powodzeniem formatuje również dłuższe wartości. Zauważ, że separator przecinka (,) w wyniku zależy od ustawień regionalnych. Może to być po prostu spacja () dla rosyjskich ustawień regionalnych.


19
Jeśli wolisz, aby zero było wyświetlane jako 0,00 (zamiast 0,00), "#,##0.00"zamiast tego użyj wzorca .
Jonik

35

Innym sposobem, który może mieć sens w danej sytuacji, jest

BigDecimal newBD = oldBD.setScale(2);

Po prostu mówię to, ponieważ w niektórych przypadkach, jeśli chodzi o pieniądze, wykraczanie poza 2 miejsca po przecinku nie ma sensu. Posunięcie się o krok dalej może doprowadzić do

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

ale chciałem tylko podkreślić metodę setScale (która może również przyjąć drugi argument trybu zaokrąglania, aby kontrolować sposób obsługi ostatniego miejsca dziesiętnego. W niektórych sytuacjach Java zmusza cię do określenia tej metody zaokrąglania).


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

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

// wyświetla 3.14

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

// wyświetla 13


6

Podobna do odpowiedzi @Jeff_Alieffson, ale nie polegająca na domyślnych Locale :

Użyj DecimalFormatSymbolsdla wyraźnych ustawień regionalnych:

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

Lub wyraźne symbole separatorów:

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

Następnie:

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

Wynik:

12 345.00

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

1
Powinien być BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.