2010-08-03 23 views
64

Mam BigDecimal pole , które reprezentuje pieniądze i muszę wydrukować jego wartość w przeglądarce w formacie takim jak $123.00, $15.50, $0.33.Jak wydrukować sformatowane wartości BigDecimal?

Jak mogę to zrobić?

(Tylko proste rozwiązanie, które widzę siebie robi floatValue z BigDecimal a następnie za pomocą NumberFormat aby dwucyfrowy precyzji dla części frakcji).

Odpowiedz

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

Będzie używać lokalizacji do wyboru symbolu waluty. NumberFormat's javadoc

30

Innym sposobem, który mógłby mieć sens dla danej sytuacji jest

BigDecimal newBD = oldBD.setScale(2); 

Właśnie to powiedzieć, bo w niektórych przypadkach gdy chodzi o pieniądze wykraczającej poza 2 miejsc po przecinku nie ma sensu. Biorąc to krok dalej, może to prowadzić do

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

ale ja po prostu chciałem, aby wyróżnić metodę setScale (co może mieć również drugi tryb zaokrąglania argumentu kontrolować sposób, że ostatnie miejsce po przecinku jest obsługiwany. W niektórych sytuacjach, Java wymusza określenie tej metody zaokrąglania).

26

Aby ustawić separator tysięcy, powiedzmy 123,456.78 trzeba 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ć #,###.00 maskę, to z powodzeniem formatuje dłuższe wartości zbyt. Należy zauważyć, że separator przecinka (,) w wyniku zależy od ustawień narodowych. Może to być po prostu spacja() dla rosyjskiego locale.

+11

Jeśli wolisz zerowy być wyświetlany jako 0.00 (zamiast .00), użyj wzoru '" # Zamiast tego ## 0.00 ". – Jonik

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

Powinien być BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString() –

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

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

// drukuje 3,14

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

// drukuje 13