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

Roma
sumber

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.

Luca Molteni
sumber
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.

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

demongolem
sumber
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

Fluch
sumber
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
volkovs
sumber
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
Dima
sumber
1
Harus BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay