Неожиданный символ валюты в валюте 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$]