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

rzymski
źródło

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.

Luca Molteni
źródło
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.

Jeff_Alieffson
źródło
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).

demongolem
źródło
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

Fluch
źródło
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
volkovs
źródło
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
źródło
1
Powinien być BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay