货币NumberFormat中的意外货币符号

时间:2015-06-18 04:34:34

标签: java android internationalization currency

在Android模拟器上进行测试时,我发现NumberFormat实例生成的格式化字符串与报告的货币符号之间存在不一致。

我首先设置一个像这样的本地化货币格式化程序:

rbuffer

然后我用它来格式化一个值。调用的结果:

// displayLocale is af_NA DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(displayLocale); // currency is USD df.setCurrency(currency); // USD localized for af_NA

是“1美元”。这可能看起来不是很明显,但是当我检查格式化程序的细节时,事情并没有加起来。调用:

df.format(1)

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

之前有没有其他人遇到这种行为,如果有的话,任何想法是什么导致它?最后,这种行为可能会在物理设备上遇到,还是仅仅是AVD的事情?

更新:

以下是您可以从任何活动中调用以检查并打印任何有问题的格式化程序的方法:

df.getDecimalFormatSymbols().getCurrencySymbol()

如果您正在测试的设备存在问题,那么您会看到以下结果:

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 +
                        "]");
            }
        }
    }

0 个答案:

没有答案