我有一项服务向我发送我应该使用的货币的货币 ID。ID 是一个代表 ISO-4217 货币的数字。
java Currency 对象能够根据货币字符串ID(即USD、JPY...)获取实例,而不是根据ISO 编号代码(即840、392...)
如何使用数字值获取实例?
Maven 工件com.neovisionaries:nv-i18n:1.9包含CurrencyCode,这是一个列出所有 ISO 4217 代码的 Java 枚举。使用 CurrencyCode,从 ISO 4217 数字代码中获取 Currency 实例可以编写如下。
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
马文:
<dependency>
<groupId>com.neovisionaries</groupId>
<artifactId>nv-i18n</artifactId>
<version>1.9</version>
</dependency>
由于 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);
}
ISO 4217 货币可以在以下位置以 xml 格式找到:
http://www.currency-iso.org/dam/downloads/table_a1.xml
您可以将文件保存在您的应用程序中,并使用一些 xpath 来提取相关的货币代码,然后您可以在Currency.getInstance(String currencyCode)
.
您必须创建一个映射,将数字映射到 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);
}
}