繁体   English   中英

货币符号国际化Java

[英]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类的方法。 如果这样做,则无法知道要使用哪种货币,因为:

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

这些国家/地区中的至少一种是德语作为官方语言。 为了解决该问题,您始终需要传递一个国家/地区,即使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM