Я получил услугу, которая отправила мне валютный идентификатор валюты, с которой я должен работать. Идентификатор - это номер, который представляет собой валюту ISO-4217.
Объект java Currency позволяет получить экземпляр в соответствии с идентификатором строки валюты (например, USD, JPY...), но не в соответствии с кодом номера ISO (т.е. 840, 392...)
Как я могу получить экземпляр, используя значение числа?
Maven artifact com.neovisionaries: nv-i18n: 1.9 содержит CurrencyCode, который представляет собой перечисление Java, перечисляющее все коды ISO 4217. С CurrencyCode получение экземпляра валюты из цифрового кода ISO 4217 может быть записано следующим образом.
import java.util.Currency;
import com.neovisionaries.i18n.CurrencyCode;
public class Test
{
public static void main(String[] args)
{
// Get the Currency instance for 392 (Japanese Yen).
Currency currency
= CurrencyCode.getByCode(392).getCurrency();
// This prints "JPY".
System.out.println("currency = " + currency);
}
}
Страница проекта nv-i18n:
https://github.com/TakahikoKawasaki/nv-i18n
Maven:
<dependency>
<groupId>com.neovisionaries</groupId>
<artifactId>nv-i18n</artifactId>
<version>1.9</version>
</dependency>
Валюта ISO 4217 может быть найдена в следующем месте в формате xml:
http://www.currency-iso.org/dam/downloads/table_a1.xml
Вы можете сохранить файл внутри своего приложения и использовать бит xpath для извлечения соответствующего кода валюты, который затем можно использовать в Currency.getInstance(String currencyCode)
.
Поскольку Java 7 (возможно, не работает на Android, если Android не поддерживает Java 7), числовой код включен в данные валюты, но, к сожалению, (по какой-то странной причине) не существует статического метода поиска для него в классе 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);
}
getAvailableCurrencies()
ни getNumericCode()
не поддерживаются для Currency
в Android.
Вам нужно будет создать карту, которая сопоставляет номер с 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);
}
}