Java Numberformat似乎忽略了Android中的小数点,但仅限于美元和德国
我有一个非常奇怪的错误,NumberFormat似乎忽略了我设置的小数位数。 我使用这个相当简单的方法将表示货币的双精度值格式化为特定于语言环境的字符串,以便在屏幕上显示:Java Numberformat似乎忽略了Android中的小数点,但仅限于美元和德国,java,android,string,number-formatting,Java,Android,String,Number Formatting,我有一个非常奇怪的错误,NumberFormat似乎忽略了我设置的小数位数。 我使用这个相当简单的方法将表示货币的双精度值格式化为特定于语言环境的字符串,以便在屏幕上显示: public static String formatValueString(String currencyISO, double value) { NumberFormat numberFormat = NumberFormat.getCurrencyInstance(); if (value != Mat
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:
现在就用截图来做这个。忽略所有评论和其他不重要的东西
“欧元”和2.0作为价值,一切正常,结果是“2欧元”
但使用“USD”和相同的值,结果现在是“2.00$”
在这两种情况下,在setCurrency()之后的numberFormat对象中,maximumFractionDigits和minimumFractionDigits仍然正确设置为0
那么这些小数位是从哪里来的呢?我知道这是一个老问题,但我今天遇到了同样的问题,并且能够解决它。基本上,当您在数字格式上设置货币时,它会覆盖最小和最大分数位数。您可以在以下JDK代码副本中看到: 一旦您知道了这一点,就很容易解决:您只需在设置任何其他内容之前设置货币
public static String formatValueString(String currencyISO, double value) {
NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
numberFormat.setCurrency(java.util.Currency.getInstance(currencyISO));
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMaximumFractionDigits(0);
String result = numberFormat.format(value);
return result;
}
就这样。现在您应该有正确的小数位数。那么您没有测试荷兰语,因为这与德语相同。两美元等于2,00美元。关于数字和货币,以及。与美国相比是互换的。因此这里的小数分隔符不同。同意,这是预期的。@greenapps我想你误解了我的问题。我自己也是德国人,所以我知道如何使用,而不是。我的问题是它显示了2个小数位,但它不应该显示,很明显,2.0==Math.floor(2.0)。是的,我测试过Dutch,它显示为一个整数,没有预期的“00”。你确定floor()不会出错吗?floor()不是问题吗?@greenapps尝试了一下,没有得到同样的结果。请看我的编辑。谢谢你的回答!我从来没有抽出时间来更新这个。相应的问题就在这里,实际上提出了相同的解决方法:如果我想格式化比特币(BTC)或以太坊(ETH)的值,该怎么办?这些还不在ISO中,因此我无法调用
setCurrency()
。