1

Androidアプリケーション(使用される言語はJava)の範囲内で、国とそれぞれの通貨のリストを表示したいと思います。ただし、いくつかの奇妙な点があります。

  1. 一部のロケールでは、getDisplayCountry()によって返される値が空です(したがって、これらの国を除外します)
  2. NumberFormat.getAvailableLocales()を介してそれらをリストするときに、いくつかの国が複数回表示されますが、その理由は何ですか?
  3. 一部の国には、通貨記号と通貨コードを含む1つのエントリと、通貨コードを含むが通貨記号を含まない1つ以上のエントリがあります(「¤」で示されます)。
  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をスローしないエントリのみを表示するようにしました。これは、ロケールの国がサポートされているISO3166の国ではない場合に当てはまります。変更されたコード...

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

はい、これはAndroidv.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 に答える