货币符号国际化Java

时间:2014-06-05 16:24:30

标签: java internationalization locale currency

我正在尝试根据当前区域设置获取数字格式,但我的货币符号有问题。

这是我的方法:

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.876.543,21。数字格式是正确的,但我也需要获得货币符号。为什么我不能得到这个符号?

1 个答案:

答案 0 :(得分:3)

您获得的符号是通用货币占位符。货币未知时显示 你可能想知道为什么它是未知的。好吧,根据您的描述,您只需调用类似Locale.GERMAN的方法。如果您这样做,则无法知道要使用的货币,因为:

  • 欧元是德国和奥地利的货币
  • Swiss Frank(瑞士法郎)是瑞士的货币

这些国家/地区中的每个国家/地区都至少使用其中一种官方语言。为了解决问题,您始终需要传递一个国家/地区,即以Locale.GERMANY作为参数调用该方法。

现在,更难的部分。使用桌面应用程序时,这一切都相当容易。您所要做的就是检测当前的操作系统区域设置:

Locale currentLocale = Locale.getDefault(LocaleCategory.FORMAT);

但是,这种方法不适用于Web应用程序。我怀疑是这种情况。那么,Web浏览器提供给您的Locale可能不适合格式化货币,因为它们可能缺少有关该国家/地区的信息 解决此问题的推荐方法是创建用户配置文件并要求用户选择区域设置(分别用于UI转换和格式化)。

我仍然需要指出一件重要的事情,因为我不想让你遇到问题。如果您的应用程序中有一些货币价值(通常它应该是BigDecimal类的实例,因为double不适用于此目的),它代表特定货币的某个值< / strong>即可。无论是欧元,英镑还是美元,但价值都是具体的。为特定国家/地区货币格式化此值并不合理,因为您应首先更改金额(我相信您理解原因)。
您可能需要的是覆盖货币符号货币代码以匹配您的货币。格式和符号位置显然应保持不变。

请考虑这个例子:

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));

结果:

  

USD
  $

打印的内容取决于区域设置。这种方式可能更好,我不能说... 我相信,除非你要创建互联网货币兑换申请,否则你应该坚持我的榜样。