根据动态货币值动态更改语言环境
Change locale dynamically according to a dynamic currency value
向最终用户提供货币列表。他们可以随时选择他们感兴趣的其中之一。因此,需要根据所选货币更改 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)));
上面的这段代码将显示正确的货币值 .12
。由于货币(和区域设置)是根据用户的偏好在 运行 时间动态确定的,如果 USD
更改为不同的内容,如 GBP
,则相关的区域设置也需要更改从 en_US
到 en_GB
。否则,它将显示 GBP1.12
,其中应显示 £1.12
(为简洁起见,不包括货币汇率)。
有没有一种方法可以根据 运行 时动态提供的货币代码来确定区域设置?
如果您只支持有限数量的货币,那么您最好手动创建映射。否则会很困难,因为每种货币有不止一个有效的区域设置。例如美元可以是 en_US
或 es_US
或 es_PR
或 es_EC
...
您可以查看所有 Locale.availableLocales()
的 Currency.getInstance(locale)
以获得想法:
for (Locale locale : Locale.getAvailableLocales()) {
try {
Currency c = Currency.getInstance(locale);
System.out.println(c + "\t" + locale);
} catch (IllegalArgumentException ignore) { }
}
向最终用户提供货币列表。他们可以随时选择他们感兴趣的其中之一。因此,需要根据所选货币更改 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)));
上面的这段代码将显示正确的货币值 .12
。由于货币(和区域设置)是根据用户的偏好在 运行 时间动态确定的,如果 USD
更改为不同的内容,如 GBP
,则相关的区域设置也需要更改从 en_US
到 en_GB
。否则,它将显示 GBP1.12
,其中应显示 £1.12
(为简洁起见,不包括货币汇率)。
有没有一种方法可以根据 运行 时动态提供的货币代码来确定区域设置?
如果您只支持有限数量的货币,那么您最好手动创建映射。否则会很困难,因为每种货币有不止一个有效的区域设置。例如美元可以是 en_US
或 es_US
或 es_PR
或 es_EC
...
您可以查看所有 Locale.availableLocales()
的 Currency.getInstance(locale)
以获得想法:
for (Locale locale : Locale.getAvailableLocales()) {
try {
Currency c = Currency.getInstance(locale);
System.out.println(c + "\t" + locale);
} catch (IllegalArgumentException ignore) { }
}