Androidアプリケーション(使用される言語はJava)の範囲内で、国とそれぞれの通貨のリストを表示したいと思います。ただし、いくつかの奇妙な点があります。
- 一部のロケールでは、getDisplayCountry()によって返される値が空です(したがって、これらの国を除外します)
- NumberFormat.getAvailableLocales()を介してそれらをリストするときに、いくつかの国が複数回表示されますが、その理由は何ですか?
- 一部の国には、通貨記号と通貨コードを含む1つのエントリと、通貨コードを含むが通貨記号を含まない1つ以上のエントリがあります(「¤」で示されます)。
- ポルトガルやルクセンブルグなど、通貨記号の付いたエントリがまったくない国もあります。どちらもユーロがあります。ただし、ドイツにはユーロ記号があるため、その記号が存在しないことはあり得ません。
後で表示するリストを作成するコードは次のとおりです。
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デバイスでそのシンボルになることが保証されていますか?そして、誰かがポルトガルやルクセンブルグに住んでいたらどうなるでしょう...?
これがその方法であり、現在のように見えます。
このスクリーンショットの例では、ベルギーのエントリには通貨記号(€記号である必要があります)がありませんが、リストの後半に、次のような別のベルギーのエントリ(実際にはいくつか...)があります。
ベルギーの場合、通貨記号として「¤」が付いている国を簡単に追い出すことができますが、ポルトガルなど、適切な通貨記号が付いていない国についてはどうでしょうか。