[英]Currency Symbol Internationalization Java
我正在尝试根据当前的语言环境获取数字格式,但是货币符号有问题。
这是我的方法:
import java.util.Locale;
import java.text.NumberFormat;
public void i18nCurrency(Locale currentLocale) {
Double price = 9876543.21;
NumberFormat currencyFormatter =
NumberFormat.getCurrencyInstance(currentLocale);
System.out.println(currencyFormatter.format(price));
}
它打印:英国¤9 876 543,21,德国人9.887.543,21。 数字格式正确,但是我也需要获取货币符号。 为什么我无法获得符号?
您得到的符号是通用货币占位符。 当货币未知时显示。
您可能想知道为什么它是未知的。 好吧,从您的描述中,您只是简单地调用了传递诸如Locale.GERMAN
类的方法。 如果这样做,则无法知道要使用哪种货币,因为:
这些国家/地区中的至少一种是德语作为官方语言。 为了解决该问题,您始终需要传递一个国家/地区,即使用Locale.GERMANY
作为参数来调用该方法。
现在,更难的部分。 当您使用桌面应用程序时,这一切都非常容易。 您需要做的就是像这样检测当前的操作系统区域设置:
Locale currentLocale = Locale.getDefault(LocaleCategory.FORMAT);
但是,此方法不适用于Web应用程序。 我怀疑是这种情况。 嗯,网络浏览器为您提供的语言环境可能不适合格式化货币,因为它们可能缺少有关该国家的信息。
解决此问题的推荐方法是创建用户配置文件,并要求用户选择区域设置(单独用于UI转换和格式化)。
我仍然必须指出一件事,因为我不希望您遇到问题。 当您的应用程序中具有某些货币值时(通常应为BigDecimal
类的实例,因为double
不适合此目的),它表示某种特定货币中的值。 可以是欧元,英镑或美元,但是值是特定的。 将该值格式化为特定国家/地区的货币确实没有任何意义,因为您应该首先更改金额(我相信您知道原因)。
相反,您可能需要覆盖货币符号或货币代码以匹配您的货币。 格式和符号位置显然应该保持不变。
请考虑以下示例:
Currency dollar = Currency.getInstance("USD");
NumberFormat fmt = NumberFormat.getCurrencyInstance(Locale.GERMANY); //this gets € as currency symbol
BigDecimal monetaryAmount = BigDecimal.valueOf(12.34d);
String originalEuros = fmt.format(monetaryAmount);
System.out.println(originalEuros);
fmt.setCurrency(dollar); // change the currency symbol to $
String modifiedDollars = fmt.format(monetaryAmount);
System.out.println(modifiedDollars);
打印:
12,34€
12,34美元
等等,为什么? 您的问题的答案在于以下微妙的代码段:
System.out.println(currency.getSymbol(Locale.GERMANY));
System.out.println(currency.getSymbol(Locale.US));
结果:
美元
$
打印的内容取决于语言环境。 这样可能更好,我不能告诉...
我相信,除非您正在创建Internet货币兑换应用程序,否则应该坚持我的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.