3

好的,所以我的问题是.. 当我尝试将数字格式化为货币字符串(例如 10.23 到 $10.23)时,使用 NumberFormat 类的格式方法,它会自动四舍五入该值。当我将日语/韩语语言环境传递给 NumberFormat 的 getCurrencyInstance() 方法时,就会发生这种情况。如果是美国语言环境,一切正常。这是可以清楚地说明问题的片段:

        NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.JAPAN);
        BigDecimal bd = new BigDecimal(123.456);
        String str = formatter.format(bd);
        JOptionPane.showMessageDialog(null, str); // Output is coming ¥123 instead of ¥123.456  

我不确定我是否遗漏了什么或做了一些不合逻辑的事情。如果没有,那么有没有办法防止这种情况发生?请帮忙。

4

2 回答 2

4

看来你需要setMaximumFractionDigits设置NumberFormat

    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.JAPAN);
    BigDecimal bd = new BigDecimal(123.456);  
    formatter.setMaximumFractionDigits(4); //Replace 4 with whatever value applicable for you.
    String str = formatter.format(bd);

输出:

¥123.456
于 2012-12-31T18:20:55.890 回答
2

南巴里是对的。看看这个:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.JAPAN);
BigDecimal bd = new BigDecimal(123.456);
String str = nf.format(bd);
System.out.println("" + nf.getMaximumFractionDigits()); //prints out 0
System.out.println(str);

似乎日本的默认小数位数设置为 0。当我对 Locale.US 执行相同操作时,它显然默认为 2。使用 Nambari 的答案和 setMaximumFractionDigits。

至于为什么,感谢@Lee Meador 在评论中指出,日本货币不使用小数位(也就是你可以使用的单一日元)。

来自关于日元的维基百科文章:

“1953 年 12 月 31 日,面值小于 1 日元的硬币在小额货币处置和支付小数四舍五入法的实施后失效”

由于我懒得查韩币,我只是假设他们有类似的情况。

于 2012-12-31T19:06:13.047 回答