【问题标题】:Numberformat seems to ignore decimal places in Android - but only for US-Dollar and only in GermanyNumberformat 似乎忽略了 Android 中的小数位 - 但仅适用于美元且仅适用于德国
【发布时间】: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


【解决方案1】:

我知道这是一个老问题,但我今天遇到了同样的问题并且能够解决它。基本上,当您在 NumberFormat 上设置货币时,它会覆盖最小和最大小数位数。您可以在此 JDK 代码副本中看到它:https://github.com/frohoff/jdk8u-dev-jdk/blob/master/src/share/classes/sun/util/locale/provider/NumberFormatProviderImpl.java#L212

一旦您知道这一点,就很容易解决:您只需在设置其他任何内容之前设置货币。

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;
}

就是这样。现在你应该有正确的小数位数了。

【讨论】:

  • 感谢您的回答!我从来没有时间更新这个。对应的问题就在这里,实际上建议了相同的解决方法:issuetracker.google.com/issues/36997153
  • 如果我想格式化比特币 (BTC) 或以太坊 (ETH) 的值怎么办?这些还没有在 ISO 中,所以我不能打电话给setCurrency()
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 2011-11-03
  • 2015-04-22
  • 2020-01-12
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多