在 Android 应用程序(使用的语言是 Java)的范围内,我想显示一个国家列表及其各自的货币。但是有一些奇怪的地方:
- 对于某些语言环境,getDisplayCountry() 返回的值为空(因此我将这些国家过滤掉)
- 通过 NumberFormat.getAvailableLocales() 列出某些国家/地区时,它们会出现多次,知道为什么吗?
- 一些国家有一个带有货币符号和货币代码的条目,以及一个或多个带有货币代码但没有货币符号的条目(用“ ¤ ”表示)
- 有些国家根本没有货币符号,例如葡萄牙和卢森堡,这两个国家都有欧元。然而,这不可能是因为缺少该符号,因为德国有欧元符号。
这是创建我稍后显示的列表的一段代码:
List<String> countries = new ArrayList<String>();
List<Locale> locales = new ArrayList<Locale>();
// Explicitly check for Locales needed to create currencies
Locale[] locales = NumberFormat.getAvailableLocales();
for (Locale locale : locales) {
if (!locale.getDisplayCountry().isEmpty()) {
String country = locale.getDisplayCountry();
String currencySymbol = CurrencyAmount.getCurrencySymbol(locale);
String formatted = String.format("%s, %s", country, currencySymbol);
Log.i(TAG, formatted);
countries.add(formatted);
locales.add(locale);
}
}
上面的代码产生以下日志语句(摘录):
01-27 15:50:25.742: I/de.zainodis.SelectCurrency(13281): Deutschland, €
01-27 15:50:25.882: I/de.zainodis.SelectCurrency(13281): Portugal, ¤
01-27 15:50:25.742: I/de.zainodis.SelectCurrency(13281): Schweiz, CHF
01-27 15:50:25.742: I/de.zainodis.SelectCurrency(13281): Luxemburg, ¤
01-27 15:50:25.820: I/de.zainodis.SelectCurrency(13281): Luxemburg, ¤
01-27 15:50:25.906: I/de.zainodis.SelectCurrency(13281): Taiwan, ¤
01-27 15:50:25.914: I/de.zainodis.SelectCurrency(13281): Taiwan, NT$
我稍微修改了上面的代码,只显示条目,其中 getInstance(locale) 不会引发 IllegalArgumentException。如果区域设置的国家/地区不是受支持的 ISO 3166 国家/地区,就会出现这种情况。修改后的代码...
List<String> countries = new ArrayList<String>();
List<Locale> locales = new ArrayList<Locale>();
Locale[] locales = NumberFormat.getAvailableLocales();
for (Locale locale : locales) {
if (!locale.getDisplayCountry().isEmpty()) {
String country = locale.getDisplayCountry();
String currencySymbol = CurrencyAmount.getCurrencySymbol(locale);
try {
Currency currency = Currency.getInstance(locale);
String formatted = String.format("%s, %s, %s", country, currencySymbol,
currency.getCurrencyCode());
Log.i(TAG, String.format("%s, %s", country, currencySymbol));
SelectCurrency.countries.add(formatted);
SelectCurrency.locales.add(locale);
} catch (IllegalArgumentException e) {
// Skip these countries
}
}
}
...和输出(摘录):
01-27 15:55:01.453: I/de.zainodis.SelectCurrency(13725): Deutschland, €, EUR
01-27 15:55:01.632: I/de.zainodis.SelectCurrency(13725): Portugal, ¤, EUR
01-27 15:55:01.453: I/de.zainodis.SelectCurrency(13725): Schweiz, CHF, CHF
01-27 15:55:01.468: I/de.zainodis.SelectCurrency(13725): Luxemburg, ¤, EUR
01-27 15:55:01.578: I/de.zainodis.SelectCurrency(13725): Luxemburg, ¤, EUR
01-27 15:55:01.664: I/de.zainodis.SelectCurrency(13725): Taiwan, NT$, TWD
由于我想显示一个国家列表,每个国家都有各自的货币(作为符号),如果葡萄牙或卢森堡等国家没有附加货币符号,我该怎么办?我知道我可以选择显示货币代码,但是由于我将使用它们各自的货币呈现金额到 UI 中,我宁愿选择那些符号......我想我可以过滤掉货币符号为“¤ " 但我想知道:它是否保证是全世界每台 Android 设备上的那个符号?如果有人碰巧住在葡萄牙或卢森堡……怎么办?
这就是它的样子,它现在的样子:
在此示例屏幕截图中,比利时的条目没有货币符号(应该是 € 符号),但是在列表的后面,还有另一个比利时条目(实际上是几个......),如下所示:
因此,在比利时的情况下,我可以简单地将带有“¤”作为货币符号的那个踢掉,但是像葡萄牙这样没有正确货币符号条目的国家呢?