有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Numberformat似乎忽略了Android中的小数点,但仅限于USDollar和德国

我有一个非常奇怪的错误,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的文档,这应适用于:

Sets the currency used by this number format when formatting currency values. The min and max fraction digits remain the same.

嗯。。它大部分时间都有效。在美国,当设备语言设置为德语时,带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位(同样,只有美元在德语中),数学。地板部分绝对不是问题所在

编辑2: 现在就用截图来做这个。忽略所有评论和其他不重要的东西

enter image description here “欧元”和2.0作为价值,一切正常,结果是“2欧元”

enter image description here 但使用“USD”和相同的值,结果现在是“2.00$”

在这两种情况下,在setCurrency()之后的numberFormat对象中,maximumFractionDigits和minimumFractionDigits仍然正确设置为0

那么这些小数位是从哪里来的呢


共 (1) 个答案

  1. # 1 楼答案

    我知道这是一个老问题,但我今天遇到了同样的问题,并且能够解决它。基本上,当您在数字格式上设置货币时,它会覆盖最小和最大分数位数。您可以在这个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;
    }
    

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