Java 货币编号格式中的意外货币符号

Java 货币编号格式中的意外货币符号,java,android,internationalization,currency,Java,Android,Internationalization,Currency,在Android仿真器上测试时,我发现NumberFormat实例生成的格式化字符串与报告的货币符号不一致 我首先设置本地化货币格式化程序,如下所示: // displayLocale is af_NA DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(displayLocale); // currency is USD df.setCurrency(currency); // USD localized

在Android仿真器上测试时,我发现NumberFormat实例生成的格式化字符串与报告的货币符号不一致

我首先设置本地化货币格式化程序,如下所示:

// displayLocale is af_NA
DecimalFormat df = (DecimalFormat) 
NumberFormat.getCurrencyInstance(displayLocale);

// currency is USD
df.setCurrency(currency); // USD localized for af_NA
然后我用它来格式化一个值。调用的结果:

df.格式(1)

是“$1”。这看起来似乎并没有明显的错误,但当我检查格式化程序的详细信息时,情况就不一样了。援引:

df.getDecimalFormatSymbols().getCurrencySymbol()

收益率为“美元”,而不是预期的“$”…什么!?更奇怪的是,我还没有找到一个可以复制这个问题的物理设备。在Robolectric下运行的测试也不会表现出这种行为

以前有没有其他人遇到过这种行为?如果有,你知道是什么原因造成的吗?最后,这种行为是在物理设备上遇到的还是纯粹的AVD

更新:

这里有一个方法,您可以从任何活动中调用,以检查并打印出任何有问题的格式化程序:

void checkFormatters() {
        Currency USD = Currency.getInstance(Locale.US);
        Money oneDollar = new Money(BigDecimal.ONE, USD);

        for(Locale locale : Locale.getAvailableLocales()) {
            DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(locale);
            df.setCurrency(USD);
            String currencySymbol = df.getDecimalFormatSymbols().getCurrencySymbol();
            String localizedDollarString = CurrencyUtils.getPrettyCurrencyString(locale, oneDollar);
            if(!localizedDollarString.contains(currencySymbol)) {
                Log.w(TAG, locale.getDisplayName() + ": Expected localized dollar string [" + localizedDollarString +
                        "] to contain currency symbol [" + currencySymbol +
                        "]");
            }
        }
    }
如果您正在测试的设备存在此问题,则您将看到如下结果:

Uzbek (LATN): Expected localized dollar string [$ 1] to contain currency symbol: [US$]
Uzbek (Uzbekistan,UZ): Expected localized dollar string [$ 1] to contain currency symbol: [US$]

您能说明一下您是如何初始化
displayLocale
currency
的吗
df.getDecimalFormatSymbols().getCurrencySymbol()
适合我。我正在使用
Locale.getAvailableCales()
并测试所有可用的。许多(但不是所有)非洲地区都有这个问题。我的Currency init代码是
Currency.getInstance(Locale.US)
。同样,我只能在模拟器上复制这个问题。我的AVD演示这个问题的目标是:Google API(x86系统映像)(API级别19)如何初始化和分配
displayLocale
。我尝试在netbeans中使用非洲货币,但没有问题。正如我所说,我循环并测试所有可用的区域设置-我没有显式初始化特定的区域设置。我对Locale实例的使用在上面完整地记录了下来。我不希望您能够在Netbeans中复制此问题,因为我无法在自己的单元测试中或在除上述特定模拟器之外的任何设备上复制此问题。