Bagaimana cara mencetak nilai BigDecimal yang diformat?


104

Saya memiliki BigDecimallapangan amountyang mewakili uang, dan saya perlu untuk mencetak nilainya di browser dalam format seperti $123.00, $15.50, $0.33.

Bagaimana saya bisa melakukan itu?

(Satu-satunya solusi sederhana yang saya lihat sendiri dapatkan floatValuedari BigDecimaldan kemudian gunakan NumberFormatuntuk membuat presisi dua digit untuk bagian pecahan).

Jawaban:


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

Ini akan menggunakan default JVM Anda saat ini Localeuntuk memilih simbol mata uang Anda. Atau Anda dapat menentukan a Locale.

NumberFormat.getInstance(Locale.US)

Untuk info lebih lanjut, lihat NumberFormatkelas.


Apakah mungkin untuk menentukan pola seperti yang dilakukan DecimalFormat?
Philippe Gioseffi

71

Untuk mengatur ribuan pemisah, katakanlah 123,456.78Anda harus menggunakan 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)));

Inilah hasilnya:

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

Meskipun saya mengatur #,###.00mask, itu berhasil memformat nilai yang lebih panjang juga. Perhatikan bahwa pemisah koma (,) bergantung pada lokal Anda. Mungkin hanya spasi () untuk bahasa Rusia.


19
Jika Anda lebih suka nol untuk ditampilkan sebagai 0,00 (bukan 0,00), gunakan pola "#,##0.00"sebagai gantinya.
Jonik

35

Cara lain yang masuk akal untuk situasi tertentu adalah

BigDecimal newBD = oldBD.setScale(2);

Saya hanya mengatakan ini karena dalam beberapa kasus ketika datang ke uang melebihi 2 tempat desimal tidak masuk akal. Mengambil langkah ini lebih jauh, ini bisa mengarah ke

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

tetapi saya hanya ingin menyoroti metode setScale (yang juga dapat menggunakan argumen mode pembulatan kedua untuk mengontrol bagaimana tempat desimal terakhir ditangani. Dalam beberapa situasi, Java memaksa Anda untuk menentukan metode pembulatan ini).


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

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

// mencetak 3.14

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

// mencetak 13


6

Mirip dengan jawaban oleh @Jeff_Alieffson, tetapi tidak mengandalkan default Locale:

Gunakan DecimalFormatSymbolsuntuk lokal eksplisit:

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

Atau simbol pemisah eksplisit:

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

Kemudian:

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

Hasil:

12 345.00

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

1
Harus BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.