您获得的符号是通用货币占位符。币种未知时显示。
你可能想知道为什么它是未知的。好吧,根据您的描述,您只是简单地调用了传递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 美元
等等,为什么?您的问题的答案在于这个微妙的代码 sn-p:
System.out.println(currency.getSymbol(Locale.GERMANY));
System.out.println(currency.getSymbol(Locale.US));
结果:
美元
$
打印的内容取决于语言环境。这种方式可能更好,我不能说...
我相信,除非您正在创建互联网货币兑换应用程序,否则您应该坚持我的示例。