จะพิมพ์ค่า BigDecimal ที่จัดรูปแบบได้อย่างไร


104

ผมมีBigDecimalข้อมูลamountซึ่งหมายถึงเงินและฉันต้องพิมพ์ค่าในเบราว์เซอร์ในรูปแบบเช่น$123.00, ,$15.50$0.33

ฉันจะทำเช่นนั้นได้อย่างไร?

(วิธีแก้ปัญหาง่ายๆเพียงวิธีเดียวที่ฉันเห็นว่าตัวเองกำลังได้รับfloatValueจากBigDecimalนั้นใช้NumberFormatเพื่อสร้างความแม่นยำสองหลักสำหรับส่วนเศษส่วน)

คำตอบ:


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

จะใช้ค่าเริ่มต้นปัจจุบันของ JVM Localeเพื่อเลือกสัญลักษณ์สกุลเงินของคุณ หรือคุณสามารถระบุไฟล์Locale.

NumberFormat.getInstance(Locale.US)

โปรดดูข้อมูลเพิ่มเติมที่NumberFormatชั้นเรียน


เป็นไปได้ไหมที่จะระบุรูปแบบเช่นเดียวกับ DecimalFormat
Philippe Gioseffi

71

ในการตั้งค่าตัวคั่นพันให้บอกว่า123,456.78คุณต้องใช้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)));

นี่คือผลลัพธ์:

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

แม้ว่าฉันจะตั้งค่ามาส#,###.00ก์ แต่ก็สามารถจัดรูปแบบค่าที่ยาวขึ้นได้เช่นกัน โปรดทราบว่าตัวคั่นลูกน้ำ (,) ในผลลัพธ์จะขึ้นอยู่กับโลแคลของคุณ อาจเป็นเพียงช่องว่าง () สำหรับภาษารัสเซีย


19
หากคุณต้องการให้ศูนย์แสดงเป็น 0.00 (แทนที่จะเป็น. 00) ให้ใช้รูปแบบ"#,##0.00"แทน
Jonik

35

อีกวิธีหนึ่งที่เหมาะสมกับสถานการณ์นั้นคือ

BigDecimal newBD = oldBD.setScale(2);

ฉันแค่พูดแบบนี้เพราะในบางกรณีการที่เงินเกินทศนิยม 2 ตำแหน่งนั้นไม่สมเหตุสมผล การก้าวไปอีกขั้นอาจนำไปสู่

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

แต่ฉันแค่ต้องการเน้นเมธอด setScale (ซึ่งสามารถใช้อาร์กิวเมนต์โหมดการปัดเศษที่สองเพื่อควบคุมวิธีจัดการตำแหน่งทศนิยมสุดท้ายนั้นในบางสถานการณ์ Java บังคับให้คุณระบุวิธีการปัดเศษนี้)


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

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

// พิมพ์ 3.14

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

// พิมพ์ 13


6

คล้ายกับคำตอบของ @Jeff_Alieffson แต่ไม่ใช้ค่าเริ่มต้น Locale :

ใช้DecimalFormatSymbolsสำหรับสถานที่ที่ชัดเจน:

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

หรือสัญลักษณ์ตัวคั่นที่ชัดเจน:

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

จากนั้น:

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

ผลลัพธ์:

12 345.00

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.