Java 如何打印格式化的BigDecimal值?
我有一个表示货币的Java 如何打印格式化的BigDecimal值?,java,formatting,bigdecimal,number-formatting,Java,Formatting,Bigdecimal,Number Formatting,我有一个表示货币的BigDecimal字段amount,我需要在浏览器中以$123.00,$15.50,$0.33等格式打印它的值 我该怎么做 (我自己看到的唯一简单的解决方案是从BigDecimal中获取floatValue,然后使用NumberFormat对分数部分进行两位精度计算) 它将使用JVM的当前默认值来选择货币符号。或者您可以指定区域设置 NumberFormat.getInstance(Locale.US) 有关更多信息,请参见课堂。另一种对给定情况有意义的方法是 BigDec
BigDecimal
字段amount
,我需要在浏览器中以$123.00
,$15.50
,$0.33
等格式打印它的值
我该怎么做
(我自己看到的唯一简单的解决方案是从BigDecimal
中获取floatValue
,然后使用NumberFormat
对分数部分进行两位精度计算)
它将使用JVM的当前默认值来选择货币符号。或者您可以指定区域设置
NumberFormat.getInstance(Locale.US)
有关更多信息,请参见课堂。另一种对给定情况有意义的方法是
BigDecimal newBD = oldBD.setScale(2);
我之所以这样说,是因为在某些情况下,当涉及到超过小数点后2位的货币时是没有意义的。再进一步,这可能导致
String displayString = oldBD.setScale(2).toPlainString();
但我只想强调setScale方法(它还可以使用第二个舍入模式参数来控制最后一位小数的处理方式。在某些情况下,Java强制您指定此舍入方法)。要设置千位分隔符,例如
123456.78
,您必须使用:
结果如下:
123,456.75
123,456.00
123,456,123,456.78
虽然我设置了,####.00
掩码,但它也成功地格式化了较长的值。
请注意,结果中的逗号(,)分隔符取决于您的区域设置。它可能只是俄罗斯地区的空格()
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
//印刷品3.14
System.out.printf("%.0f",pi4);
//打印13个类似于@Jeff_Alieffson的答案,但不依赖默认的
区域设置:
对于显式区域设置,请使用DecimalFormatSymbols
:
DecimalFormatSymbols decimalFormatSymbols = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));
或显式分隔符符号:
DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');
然后:
结果:
12 345.00
我知道这个问题很老了,但最近我在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
如果希望0显示为0.00(而不是.00),请使用模式“#,###0.00”
。应为BigDecimal(19.001)。setScale(2,BigDecimal.ROUND_-UP)。toString()setScale不受欢迎。是否可以像DecimalFormat那样指定模式?
new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));
12 345.00
val dfs = DecimalFormatSymbols.getInstance(Locale.getDefault())
val bigD = BigDecimal("1e+30")
val formattedBigD = DecimalFormat("#,##0.#",dfs).format(bigD)
1,000,000,000,000,000,000,000,000,000,000