货币符号国际化Java

货币符号国际化Java,java,internationalization,locale,currency,Java,Internationalization,Locale,Currency,我正在尝试根据当前区域设置获取数字格式,但货币符号有问题 这是我的方法: import java.util.Locale; import java.text.NumberFormat; public void i18nCurrency(Locale currentLocale) { Double price = 9876543.21; NumberFormat currencyFormatter = NumberFormat.getCurrencyI

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

这是我的方法:

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英镑。数字格式是正确的,但我还需要获得货币符号。为什么我无法获取符号?

您获取的符号是通用货币占位符。当货币未知时显示该值。
你可能想知道为什么它是未知的。根据您的描述,您只是调用了传递类似于
Locale.derman
的内容的方法。如果您这样做了,就无法知道使用哪种货币,因为:

  • 欧元是德国和奥地利的货币
  • 瑞士法郎是瑞士的一种货币
这些国家中的每个国家都至少有一种官方语言是德语。为了解决此问题,您始终需要传递国家/地区,即使用
Locale.dermany
作为参数调用方法

现在,更难的部分。当您使用桌面应用程序时,这一切都相当容易。您只需检测当前操作系统语言环境,如下所示:

Locale currentLocale = Locale.getDefault(LocaleCategory.FORMAT);
但是,这种方法不适用于web应用程序。我怀疑情况就是这样。嗯,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货币兑换应用程序,否则您应该坚持我的示例。

您得到的符号是通用货币占位符。当货币未知时显示该值。
你可能想知道为什么它是未知的。根据您的描述,您只是调用了传递类似于
Locale.derman
的内容的方法。如果您这样做了,就无法知道使用哪种货币,因为:

  • 欧元是德国和奥地利的货币
  • 瑞士法郎是瑞士的一种货币
这些国家中的每个国家都至少有一种官方语言是德语。为了解决此问题,您始终需要传递国家/地区,即使用
Locale.dermany
作为参数调用方法

现在,更难的部分。当您使用桌面应用程序时,这一切都相当容易。您只需检测当前操作系统语言环境,如下所示:

Locale currentLocale = Locale.getDefault(LocaleCategory.FORMAT);
但是,这种方法不适用于web应用程序。我怀疑情况就是这样。嗯,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货币兑换应用程序,否则您应该坚持我的示例。

您得到的符号是通用货币占位符。当货币未知时显示该值。
你可能想知道为什么它是未知的。根据您的描述,您只是调用了传递类似于
Locale.derman
的内容的方法。如果您这样做了,就无法知道使用哪种货币,因为:

  • 欧元是德国和奥地利的货币
  • 瑞士法郎是瑞士的一种货币
这些国家中的每个国家都至少有一种官方语言是德语。为了解决此问题,您始终需要传递国家/地区,即使用
Locale.dermany
作为参数调用方法

现在,更难的部分。当您使用桌面应用程序时,这一切都相当容易。你所要做的就是