java.util.Currencyのクラス一覧を取得したい
java.util.Currencyの利用可能な通貨一覧を取得したい。Localを指定すればできるみたいなのでこんなコードを書いてみた。
List<Currency> cs = new ArrayList<Currency>(); for (Locale locale : Locale.getAvailableLocales()) { if (cs.contains(Currency.getInstance(locale))) { continue; } cs.add(Currency.getInstance(locale)); }
これを実行してみると、Currency.getInstanceでIllegalArgumentExceptionになる。どうやらLocale.getAvailableLocales()で得られるロケール全てをgetInstanceすることはできないらしい。
しょうがなく、
for (Locale locale : Locale.getAvailableLocales()) { try{ if (cs.contains(Currency.getInstance(locale))) { continue; } cs.add(Currency.getInstance(locale)); } catch (IllegalArgumentException ex) { System.out.println(locale.toString() + " is not surported."); } }
として、例外をキャッチすれば間違いなくできるんだけど、もっとスマートにやる方法はないものだろうか?
Currency.getAvailableCurrencies()があればすべて解決なんだけど。
追記:
JDK7で追加されるらしい。というか2年以上前からJava7の開発は進んでたのか…。
http://blogs.sun.com/naotoj/entry/jdk7%E3%81%A7%E3%81%AEcurrency%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E6%A9%9F%E8%83%BD%E6%8B%A1%E5%BC%B5
追記:
とりあえずこんな感じになった。Webブラウザの言語設定に合わせてデフォルト通貨を設定するようにしてる*1。
List<Currency> cs = new ArrayList<Currency>(); for (Locale locale : Locale.getAvailableLocales()) { if (locale.toString().length() != 5) { continue; } Currency currency = Currency.getInstance(locale); if (locale.toString().startsWith(request.getLocale().toString())) { cs.add(0, currency); } else { if (cs.contains(currency)) { continue; } cs.add(currency); } }