我有一个BigDecimal字段amount,它代表钱,我需要在浏览器中以$123.00,$15.50,$0.33等格式打印它的值。我该怎么做?(The我认为自己唯一简单的解决方案是从BigDecimal得到floatValue,然后使用NumberFormat使分数部分具有两位数精度)。
BigDecimal
amount
$123.00
$15.50
$0.33
floatValue
NumberFormat
rnmwe5a21#
public static String currencyFormat(BigDecimal n) { return NumberFormat.getCurrencyInstance().format(n); }
它将使用JVM的当前默认值Locale来选择货币符号。也可以指定Locale。
Locale
NumberFormat.getInstance(Locale.US)
有关更多信息,请参见NumberFormat类。
x6yk4ghg2#
要设置千位分隔符,例如123,456.78,您必须使用DecimalFormat:
123,456.78
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掩码,但它也成功地格式化了较长的值。请注意,result中的逗号(,)分隔符取决于您的区域设置。它可能只是俄罗斯地区的空格()。
#,###.00
11dmarpk3#
另一种对给定情况有意义的方法是
BigDecimal newBD = oldBD.setScale(2);
我这么说是因为 * 在某些情况下 * 当涉及到超过2个小数位的钱时,这是没有意义的。更进一步,这可能会导致
String displayString = oldBD.setScale(2).toPlainString();
但我只想强调setScale方法(它也可以使用第二个舍入模式参数来控制如何处理最后一个小数位)。在某些情况下,Java会强制您指定这种舍入方法)。
qhhrdooz4#
BigDecimal pi = new BigDecimal(3.14); BigDecimal pi4 = new BigDecimal(12.56); System.out.printf("%.2f",pi);
// prints 3.14
System.out.printf("%.0f",pi4);
//print 13
uplii1fm5#
类似于@Jeff_Alieffson的回答,但不依赖于默认的Locale:使用DecimalFormatSymbols作为显式区域设置:
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
pdkcd3nj6#
我知道这个问题很老了,但我最近在我的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
ovfsdjhp7#
BigDecimal("19.0001").setScale(2, BigDecimal.RoundingMode.DOWN)
7条答案
按热度按时间rnmwe5a21#
它将使用JVM的当前默认值
Locale
来选择货币符号。也可以指定Locale
。有关更多信息,请参见
NumberFormat
类。x6yk4ghg2#
要设置千位分隔符,例如
123,456.78
,您必须使用DecimalFormat:结果如下:
虽然我设置了
#,###.00
掩码,但它也成功地格式化了较长的值。请注意,result中的逗号(,)分隔符取决于您的区域设置。它可能只是俄罗斯地区的空格()。11dmarpk3#
另一种对给定情况有意义的方法是
我这么说是因为 * 在某些情况下 * 当涉及到超过2个小数位的钱时,这是没有意义的。更进一步,这可能会导致
但我只想强调setScale方法(它也可以使用第二个舍入模式参数来控制如何处理最后一个小数位)。在某些情况下,Java会强制您指定这种舍入方法)。
qhhrdooz4#
// prints 3.14
//print 13
uplii1fm5#
类似于@Jeff_Alieffson的回答,但不依赖于默认的
Locale
:使用
DecimalFormatSymbols
作为显式区域设置:或显式分隔符:
然后:
结果:
pdkcd3nj6#
我知道这个问题很老了,但我最近在我的Kotlin应用程序中做了类似的事情。这里有一个例子,如果有人需要它:
显示$formattedBigD的结果:
ovfsdjhp7#