使用する通貨の通貨 ID を送信してくれるサービスを利用しました。ID は、ISO-4217 通貨を表す数値です。
java Currency オブジェクトは、通貨文字列 ID (つまり、USD、JPY...) に従ってインスタンスを取得できますが、ISO 番号コード (つまり、840、392...) に従ってインスタンスを取得することはできません。
数値を使用してインスタンスを取得するにはどうすればよいですか?
Java 7 以降 (Android が Java 7 をサポートしない限り、おそらく Android では動作しません)、数値コードは通貨データに含まれていますが、残念ながら (何らかの奇妙な理由で) Currency クラスには静的なルックアップ メソッドがありません。
このようなメソッドを自分で実装すると、呼び出しごとにすべての通貨を反復処理する代わりに、パフォーマンスを最適化するためのルックアップ マップを作成できる可能性があります。
public static Currency getByCode(int code) {
for(Currency c : Currency.getAvailableCurrencies()) {
if(c.getNumericCode() == code) {
return c;
}
}
throw new IllegalArgumentException("Unkown currency code: " + code);
}
番号を ISO 文字列にマップするマップを作成する必要があります。
class MyISO4217Mapper {
private static final Map<Integer, String> mapOfISO4217 = new HashMap<>();
static {
// create static mappings here:
mapOfISO4217.put(710, "ZAR");
// .
// .
// .
mapOfISO4217.put(840, "USD");
}
public static Currency getISOCode(Integer id) {
String isoCode = mapOfISO4217.get(id);
return Currency.getInstance(isoCode);
}
}