【发布时间】:2014-08-03 06:02:09
【问题描述】:
我遇到了一个非常奇怪的错误,其中 NumberFormat 似乎忽略了我设置的小数位数。 我正在使用这种相当简单的方法将表示货币的双精度值格式化为特定于语言环境的字符串以显示在屏幕上:
public static String formatValueString(String currencyISO, double value) {
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
if (value != Math.floor(value)) {
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
} else {
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMaximumFractionDigits(0);
}
numberFormat.setCurrency(java.util.Currency.getInstance(currencyISO));
String result = numberFormat.format(value);
return result;
}
它应该只在需要时显示 2 位小数,根据 setCurrency 的文档应该可以工作:
在格式化货币值时设置此数字格式使用的货币。 最小和最大小数位数保持不变。
嗯.. 它大部分时间都有效。当设备语言设置为德语时,带有 ISO "GBP" 的 2.0 正确格式为 "2 £",而在美国设置为英语时,格式为 "£2"。
但是,将“USD”作为 ISO 的 2.0 在设置为德语时会产生“2,00 $”。我测试过的所有其他语言和所有其他货币都按预期工作。
我真的不知道,我可能做错了什么,只在一个特定的情况下不起作用。有什么想法吗?
编辑:
我试过这个简化版:
public static String formatValueString(String currencyISO, double value) {
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMaximumFractionDigits(0);
numberFormat.setCurrency(java.util.Currency.getInstance(currencyISO));
String result = numberFormat.format(value);
return result;
}
同样的结果,仍然显示不应该存在的小数点后 2 位(同样,仅适用于德语中的美元),Math.floor 部分绝对不是问题。
编辑 2: 现在用截图来做这件事。忽略所有评论和其他不重要的东西。
使用“EUR”和 2.0 作为值,一切正常,结果是“2 €”
但是对于“USD”和相同的值,结果现在是“2.00 $”。
在这两种情况下,在 setCurrency() 之后,maximumFractionDigits 和 minimumFractionDigits 在 numberFormat 对象中仍然正确设置为 0。
那么这些小数位是从哪里来的???
【问题讨论】:
-
那么您没有测试荷兰语,因为这与德语相同。两美元写成 2,00 $。关于数字和货币,和。与美国相比是互换的。所以
DecimalSeparator在这里是不同的。 -
同意,这按预期工作。
-
@greenapps 我想你误解了我的问题。我自己是德国人,所以我知道使用 , 而不是 . .我的问题是它显示了 2 个小数位,它不应该显示 2.0 == Math.floor(2.0)。是的,我确实测试了荷兰语,它显示为一个整数,没有“,00”,正如预期的那样。
-
你确定 floor() 没有出错?不是 floor() 的问题吗?
-
@greenapps 试过了,结果一样。查看我的编辑。
标签: java android string number-formatting