如何打印格式化的 BigDecimal 值?
Posted
技术标签:
【中文标题】如何打印格式化的 BigDecimal 值?【英文标题】:How to print formatted BigDecimal values? 【发布时间】:2010-08-03 10:57:28 【问题描述】:我有一个代表钱的BigDecimal
字段amount
,我需要在浏览器中以$123.00
、$15.50
、$0.33
等格式打印它的值。
我该怎么做?
(我看到自己唯一简单的解决方案是从BigDecimal
获取floatValue
,然后使用NumberFormat
为小数部分设置两位数精度)。
【问题讨论】:
【参考方案1】:public static String currencyFormat(BigDecimal n)
return NumberFormat.getCurrencyInstance().format(n);
它将使用您的 JVM 当前默认的 Locale
来选择您的货币符号。或者您可以指定Locale
。
NumberFormat.getInstance(Locale.US)
有关详细信息,请参阅NumberFormat
类。
【讨论】:
是否可以像 DecimalFormat 一样指定模式?【参考方案2】:要设置千位分隔符,比如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
掩码,但它也成功地格式化了较长的值。
请注意,结果中的逗号 (,) 分隔符取决于您的语言环境。对于俄语语言环境,它可能只是空格()。
【讨论】:
如果您希望零显示为 0.00(而不是 .00),请改用模式"#,##0.00"
。【参考方案3】:
另一种对给定情况有意义的方法是
BigDecimal newBD = oldBD.setScale(2);
我之所以这么说是因为在某些情况下,当涉及到超过小数点后 2 位的金钱时,这是没有意义的。更进一步,这可能会导致
String displayString = oldBD.setScale(2).toPlainString();
但我只是想强调 setScale 方法(它也可以采用第二个舍入模式参数来控制如何处理最后一个小数位。在某些情况下,Java 会强制您指定此舍入方法)。
【讨论】:
我认为 java 在所有情况下都会强制执行,但关键是某些数字符合比例,例如 1.55,有些不喜欢 1.555,需要了解如何舍入 x.xx5部分。【参考方案4】: 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
【讨论】:
【参考方案5】:与@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
【讨论】:
【参考方案6】:BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
【讨论】:
应该是 BigDecimal(19.001).setScale(2, BigDecimal.ROUND_HALF_UP).toString() setScale 已弃用【参考方案7】:我知道这个问题很老了,但我最近在我的 kotlin 应用程序中做了类似的事情。如果有人需要,这里有一个例子:
val dfs = DecimalFormatSymbols.getInstance(Locale.getDefault())
val bigD = BigDecimal("1e+30")
val formattedBigD = DecimalFormat("#,##0.#",dfs).format(bigD)
结果显示 $formattedBigD:
1,000,000,000,000,000,000,000,000,000,000
【讨论】:
以上是关于如何打印格式化的 BigDecimal 值?的主要内容,如果未能解决你的问题,请参考以下文章
Mac M1 Big Sur 上的错误“dlsym(0x7f8ffd410a90, Init_bigdecimal): symbol not found”