Định dạng BigDecimal dưới dạng chuỗi với tối đa 2 chữ số thập phân, loại bỏ 0 trên phần thập phân


80

Tôi có một số BigDecimal và tôi chỉ xem xét 2 chữ số thập phân của nó, vì vậy tôi cắt nó bằng cách sử dụng:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN)

Bây giờ tôi muốn in nó dưới dạng Chuỗi nhưng loại bỏ phần thập phân nếu nó là 0, ví dụ:

1,00 -> 1

1,50 -> 1,5

1,99 -> 1,99

Tôi đã thử sử dụng Formatter, formatter.format nhưng tôi luôn nhận được 2 chữ số thập phân.

Tôi có thể làm cái này như thế nào? Có thể làm việc trên chuỗi từ bd.toPlainString ()?

Câu trả lời:


103

Tôi đã sử dụng DecimalFormat để định dạng BigDecimal thay vì định dạng chuỗi, dường như không có vấn đề gì với nó.

Mã là một cái gì đó như thế này:

bd = bd.setScale(2, BigDecimal.ROUND_DOWN);

DecimalFormat df = new DecimalFormat();

df.setMaximumFractionDigits(2);

df.setMinimumFractionDigits(0);

df.setGroupingUsed(false);

String result = df.format(bd);

Đầu ra mong đợi cho chương trình này là gì. Tôi nhận được các yêu cầu tương tự đối với các số không ở cuối sau dấu chấm thập phân nhưng các số không ở cuối như .00 cắt ngắn trong đầu ra.
Paramesh Korrakuti

1
@ParameshKorrakuti df.setMinimumFractionDigits(2)hoạt động tốt mà không cần setScale và setGrouping và setMaxFrac.
Andrew Grinder

4
Định dạng thập phân là Định dạng số được ngụy trang. NumberFormat numberFormat = NumberFormat.getPercentInstance();Sau đó sử dụng sau numberFormat.setMinimumFractionDigits(2);đóString percent = numberFormat.format(yourBigDecimal);
Andrew Grinder

1
Java 9 trở lên BigDecimal.ROUND_DOWNkhông được dùng nữa. Sử dụng RoundingMode.DOWNthay thế.
Dilantha

69
new DecimalFormat("#0.##").format(bd)

42
Tôi sử dụng new DecimalFormat("0.00")nếu tôi muốn đảm bảo rằng hai chữ số thập phân luôn được hiển thị, ví dụ: 1000.5sẽ hiển thị dưới dạng 1000.50.
Chris Parton

1
Giải pháp của @ ChrisParton hoạt động hoàn hảo, ngoài ra nếu một số yêu cầu áp dụng bản địa hóa, chúng ta có thể sử dụng logic bên dưới. import java.math.BigDecimal; import java.text.*; public class LocalizeExample { public static void main(String[] args) { BigDecimal bd = new BigDecimal("123.10"); DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(Locale.GERMAN); decimalFormat.applyPattern("#0.00"); String result = decimalFormat.format(bd); System.out.println(result); } }
Paramesh Korrakuti

14

Đoạn mã dưới đây có thể giúp bạn.

protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
    final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
    numberFormat.setGroupingUsed(true);
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);
    return numberFormat.format(input);
}


3

Nếu tiền của nó sử dụng:

NumberFormat.getNumberInstance(java.util.Locale.US).format(bd)
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.