Làm thế nào để in các giá trị BigDecimal được định dạng?


104

Tôi có một BigDecimallĩnh vực amountmà đại diện cho tiền bạc, và tôi cần in giá trị của nó trong trình duyệt trong một định dạng như $123.00, $15.50, $0.33.

Làm thế nào tôi có thể làm điều đó?

(Giải pháp duy nhất đơn giản mà tôi thấy bản thân mình là nhận được floatValuetừ BigDecimalvà sau đó sử dụng NumberFormatđể làm cho hai chữ số chính xác cho phần phần).

Câu trả lời:


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

Nó sẽ sử dụng mặc định hiện tại của JVM Localeđể chọn ký hiệu tiền tệ của bạn. Hoặc bạn có thể chỉ định a Locale.

NumberFormat.getInstance(Locale.US)

Để biết thêm thông tin, hãy xem NumberFormatlớp học.


Có thể chỉ định một mẫu giống như DecimalFormat không?
Philippe Gioseffi

70

Để đặt dấu phân cách nghìn, giả sử 123,456.78bạn phải sử dụng 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)));

Đây là kết quả:

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

Mặc dù tôi đặt #,###.00mặt nạ, nó cũng định dạng thành công các giá trị dài hơn. Lưu ý rằng dấu phân cách bằng dấu phẩy (,) phụ thuộc vào ngôn ngữ của bạn. Nó có thể chỉ là dấu cách () cho ngôn ngữ Nga.


19
Nếu bạn muốn số 0 được hiển thị là 0,00 (thay vì 0,00), hãy sử dụng mẫu "#,##0.00"thay thế.
Jonik

35

Một cách khác có thể có ý nghĩa đối với tình huống đã cho là

BigDecimal newBD = oldBD.setScale(2);

Tôi chỉ nói điều này bởi vì trong một số trường hợp , tiền vượt quá 2 chữ số thập phân không có ý nghĩa. Tiến thêm một bước nữa, điều này có thể dẫn đến

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

nhưng tôi chỉ muốn làm nổi bật phương thức setScale (cũng có thể lấy đối số chế độ làm tròn thứ hai để kiểm soát cách xử lý chữ số thập phân cuối cùng đó. Trong một số tình huống, Java buộc bạn phải chỉ định phương thức làm tròn này).


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

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

// in ra 3.14

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

// in ra 13


6

Tương tự như câu trả lời của @Jeff_Alieffson, nhưng không dựa trên mặc định Locale:

Sử dụng DecimalFormatSymbolscho ngôn ngữ rõ ràng:

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

Hoặc các ký hiệu phân tách rõ ràng:

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

Sau đó:

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

Kết quả:

12 345.00

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

1
Phải là BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.