Неожиданный символ валюты в валюте NumberFormat

Во время тестирования на эмуляторе Android я натолкнулся на несоответствие между отформатированными строками, созданными экземпляром NumberFormat, и сообщаемым символом валюты.

Я начну с настройки локализованного средства форматирования валюты следующим образом:

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

// currency is USD
df.setCurrency(currency); // USD localized for af_NA

Затем я использую его для форматирования значения. Результат вызова:

df.format(1)

это "1 доллар". Это может показаться не совсем правильным, но когда я проверяю детали средства форматирования, вещи не складываются. Вызов:

df.getDecimalFormatSymbols().getCurrencySymbol()

дает "USD", а не ожидаемый "$"... что!? Даже более странно, я еще не нашел физического устройства, на котором я мог бы повторить проблему. Тесты, выполняемые под 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$]

0 ответов

Другие вопросы по тегам