121

我有一个代表钱的BigDecimal字段amount,我需要在浏览器中以类似$123.00, $15.50,的格式打印它的值$0.33

我怎样才能做到这一点?

(我看到自己的唯一简单解决方案是floatValue从中获取BigDecimal,然后NumberFormat用于为小数部分制作两位数精度)。

4

7 回答 7

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

它将使用您 JVM 的当前默认值Locale来选择您的货币符号。或者您可以指定一个Locale.

NumberFormat.getInstance(Locale.US)

有关详细信息,请参阅NumberFormat类。

于 2010-08-03T11:01:28.077 回答
81

要设置千位分隔符,假设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了掩码,但它也成功地格式化了较长的值。请注意,结果中的逗号 (,) 分隔符取决于您的语言环境。对于俄语语言环境,它可能只是空格()。

于 2015-07-21T05:45:00.323 回答
42

对于给定情况可能有意义的另一种方法是

BigDecimal newBD = oldBD.setScale(2);

我之所以这么说,是因为在某些情况下,超过小数点后 2 位的钱是没有意义的。更进一步,这可能会导致

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

但我只是想强调 setScale 方法(它也可以采用第二个舍入模式参数来控制如何处理最后一个小数位。在某些情况下,Java 会强制您指定此舍入方法)。

于 2011-12-20T21:02:19.713 回答
18
 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

于 2017-09-20T03:46:23.843 回答
10

类似于@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
于 2019-05-06T11:54:46.880 回答
1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
于 2016-06-26T06:51:11.197 回答
0

我知道这个问题很老了,但我最近在我的 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
于 2021-01-27T16:11:44.437 回答