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.