Java 如何避免NumberFormat(Locale).format()方法在格式化值时自动舍入?

Java 如何避免NumberFormat(Locale).format()方法在格式化值时自动舍入?,java,currency-formatting,Java,Currency Formatting,好吧,我的问题是。。当我尝试使用NumberFormat类的format方法将数字格式化为货币字符串(例如10.23到10.23美元)时,它会自动舍入值。当我将日文/韩文语言环境传递给NumberFormat的getCurrencyInstance()方法时,就会发生这种情况。就我们而言,一切都很顺利。下面是一个片段,可以清楚地说明问题: NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.JAPAN)

好吧,我的问题是。。当我尝试使用NumberFormat类的format方法将数字格式化为货币字符串(例如10.23到10.23美元)时,它会自动舍入值。当我将日文/韩文语言环境传递给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  

我不确定我是否遗漏了什么或者做了一些不合逻辑的事情。如果没有,那么有没有办法防止这一轮淘汰?请提供帮助。

您似乎需要为
NumberFormat
设置
setMaximumFractionDigits

    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

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

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的答案并设置MaximumFractionDigits

至于原因,多亏@Lee Meador在评论中指出了这一点,日本货币不使用小数点位(也就是说,一个日元就够了)

摘自维基百科关于日元的一篇文章:

1953年12月31日,在执行《小额货币处置和部分四舍五入支付法》后,面额低于1日元的硬币失效


由于我懒得查找韩国货币,我只想假设它们也有类似的情况。

我已经知道这种方法,但我不想限制输出中的小数位数。为什么格式化方法在JP/KR等语言环境中的行为不同?@user1887318:当您使用getInstance(语言环境)时,它的行为似乎是特定于语言环境的实现。我没有完全理解你说的话。让我给你更多的细节。我希望NumberFormat根据区域设置格式化输入。如果我的输入是123456.789,那么我希望输出为:Locale.US中的123456.789美元,Locale.FRANCE中的123456789欧元,Locale.GERMANY中的123.456789欧元,Locale.JAPAN中的123456.789日元。若我错了,请纠正我,但这就是格式化方法的行为。正如@ARC所解释的,不知何故,japanlocal将0作为分数位数。正如我在前面的评论中所说,当您使用getInstance(locale)时,行为是基于locale定义的。某些locale在小数点后显示的位数有不同的默认值。Nambari设置最大分数位数的解决方案似乎是正确的。正如美国和欧盟分别使用美元和欧元的两位数标准,日本使用零位数作为标准。如果人们走进一家商店或看一份会计报告,看到美元(或欧元)除了两位数以外的任何数字,大多数人都会感到困惑。有些东西是以十分之一美分出售的,但不是太多。唯一的其他常见用法是显示整美元和圆。例如,这可以在美国纳税申报表上完成。这是有用的信息。谢谢@ARC:我的答案告诉了fix,但这个答案很好地解释了这个问题。但这只适用于CurrencyInstance。其他人呢?