根据动态货币值动态更改区域设置
问题描述:
为最终用户提供货币列表。他们可以随时选择他们的兴趣之一。因此,java.text.NumberFormat
中使用的语言环境需要根据所选货币进行更改。这似乎并不重要。根据动态货币值动态更改区域设置
Locale locale = new Locale("en", "US");
NumberFormat decimalFormat = NumberFormat.getCurrencyInstance(locale);
decimalFormat.setGroupingUsed(true);
decimalFormat.setCurrency(Currency.getInstance("USD"));
System.out.println(decimalFormat.format(BigDecimal.valueOf(1.12)));
上面的代码将显示正确的货币值$1.12
。由于货币(和区域设置)是根据用户的偏好在运行时动态确定的,因此如果USD
更改为与GBP
不同的内容,则相关区域设置也需要从en_US
更改为en_GB
。否则,它将显示GBP1.12
,其中£1.12
预计(为简洁起见,汇率除外)。
有没有一种方法可以根据在运行时动态提供的货币代码来确定区域设置?
答
如果您只支持数量有限的货币,那么您最好手动创建映射。否则,这将会很困难,因为每种货币都有多个有效区域设置。例如美元可en_US
或es_US
或es_PR
或es_EC
...
你可以看一下Currency.getInstance(locale)
所有Locale.availableLocales()
获得一个想法:
for (Locale locale : Locale.getAvailableLocales()) {
try {
Currency c = Currency.getInstance(locale);
System.out.println(c + "\t" + locale);
} catch (IllegalArgumentException ignore) { }
}