1

在 Android 应用程序(使用的语言是 Java)的范围内,我想显示一个国家列表及其各自的货币。但是有一些奇怪的地方:

  1. 对于某些语言环境,getDisplayCountry() 返回的值为空(因此我将这些国家过滤掉)
  2. 通过 NumberFormat.getAvailableLocales() 列出某些国家/地区时,它们会出现多次,知道为什么吗?
  3. 一些国家有一个带有货币符号和货币代码的条目,以及一个或多个带有货币代码但没有货币符号的条目(用“ ¤ ”表示)
  4. 有些国家根本没有货币符号,例如葡萄牙和卢森堡,这两个国家都有欧元。然而,这不可能是因为缺少该符号,因为德国有欧元符号。

这是创建我稍后显示的列表的一段代码:

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 设备上的那个符号?如果有人碰巧住在葡萄牙或卢森堡……怎么办?

这就是它的样子,它现在的样子:

在此处输入图像描述

在此示例屏幕截图中,比利时的条目没有货币符号(应该是 € 符号),但是在列表的后面,还有另一个比利时条目(实际上是几个......),如下所示:

在此处输入图像描述

因此,在比利时的情况下,我可以简单地将带有“¤”作为​​货币符号的那个踢掉,但是像葡萄牙这样没有正确货币符号条目的国家呢?

4

2 回答 2

1

谷歌代码问题有问题

// http://code.google.com/p/android/issues/detail?id=38622
    public void test_getSymbol_38622() throws Exception {
        // The CLDR data had the Portuguese symbol for "EUR" in pt, not in pt_PT.
        // We weren't falling back from pt_PT to pt, so we didn't find it and would
        // default to U+00A4 CURRENCY SIGN (¤) rather than €.
        Locale pt_BR = new Locale("pt", "BR");
        Locale pt_PT = new Locale("pt", "PT");
        assertEquals("R$", Currency.getInstance(pt_BR).getSymbol(pt_BR));
        assertEquals("BR$", Currency.getInstance(pt_BR).getSymbol(pt_PT));
        assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_BR));
        assertEquals("€", Currency.getInstance(pt_PT).getSymbol(pt_PT));
    }
于 2013-01-27T15:57:27.947 回答
1

是的,这是一个仅在 Android v.4.3中修复的 Google 问题。我正在使用下面的解决方法来解决具有 pt_PT 语言环境的设备的此问题。

if (Locale.getDefault().toString().equals("pt_PT")) {
       mCurrencyNumberFormat = NumberFormat.getCurrencyInstance(Locale.getDefault());
       DecimalFormatSymbols dfs = ((DecimalFormat)mCurrencyNumberFormat).getDecimalFormatSymbols();
       dfs.setCurrencySymbol("\u20AC");
       ((DecimalFormat)mCurrencyNumberFormat).setDecimalFormatSymbols(dfs);
}

所以现在显示的是 € 符号,而不是有问题的 ¤ 符号。享受 )))

于 2014-06-15T21:29:20.847 回答