2013-02-27 81 views
20

我想根据它们的区域设置获取货币的符号。但不是返回一个符号,而是返回代码。我有一个片段:没有获取特定区域设置的货币符号

import java.util.Currency; 
import java.util.Locale; 

public class CurrencyFormat 
{ 
    public void displayCurrencySymbols() 
    { 
    Currency currency = Currency.getInstance(Locale.US); 
    System.out.println("United States: " + currency.getSymbol()); 
    } 
    public static void main(String[] args) 
    { 
    new CurrencyFormat().displayCurrencySymbols(); 
    } 
} 

对于Locale.US它给符号$但如果我

Currency currency = Currency.getInstance(Locale.GERMANY); 

然后,而不是象征它给替换

Currency currency = Currency.getInstance(Locale.US); 

国家代码。为什么是这样以及我们如何获得符号?

编辑:寻找一些答案后,我想明确的是,设置一些特定的默认地方是不是一个解决方案,我需要一次显示所有avalaible迹象。

例如

Locale.setDefault(Locale.UK); 

会给我欧元符号,但对于美元,它会给代码而不是美元符号($)。

+0

我得到'USD'而不是'$',最新的Java 7在Windows 7上我的默认的语言环境是英国人,但是。对于德国我看到一个欧元符号,对于英国我看到一个英镑符号。 – 2013-02-27 07:39:58

+0

你使用的是什么版本的Java? – 2013-02-27 07:42:49

+0

如果我设置'Locale.setDefault(Locale.US);',我会得到和你一样的结果。 – 2013-02-27 07:42:53

回答

30

喜,请尝试以下代码

import java.text.NumberFormat; 
import java.util.Comparator; 
import java.util.Currency; 
import java.util.Locale; 
import java.util.SortedMap; 
import java.util.TreeMap; 

public class CurrencyExample 
{ 
    public static void main(String[] args) 
    { 
     Utils.getCurrencySymbol(Currency.getInstance(Locale.US).getCurrencyCode()); 
     Utils.getCurrencySymbol(Currency.getInstance(Locale.JAPAN).getCurrencyCode()); 
     Utils.getCurrencySymbol(Currency.getInstance(Locale.UK).getCurrencyCode()); 
     Utils.getCurrencySymbol("INR"); 
    } 
} 

class Utils{ 
     public static SortedMap<Currency, Locale> currencyLocaleMap; 
     static { 
      currencyLocaleMap = new TreeMap<Currency, Locale>(new Comparator<Currency>() { 
      public int compare(Currency c1, Currency c2){ 
       return c1.getCurrencyCode().compareTo(c2.getCurrencyCode()); 
      } 
     }); 
     for (Locale locale : Locale.getAvailableLocales()) { 
      try { 
       Currency currency = Currency.getInstance(locale); 
      currencyLocaleMap.put(currency, locale); 
      }catch (Exception e){ 
     } 
     } 
    } 

    public static String getCurrencySymbol(String currencyCode) { 
     Currency currency = Currency.getInstance(currencyCode); 
     System.out.println(currencyCode+ ":-" + currency.getSymbol(currencyLocaleMap.get(currency))); 
     return currency.getSymbol(currencyLocaleMap.get(currency)); 
    } 
} 

上述程序的输出是这样的:

USD:-$ 
JPY:-¥ 
GBP:-£ 
INR:-Rs. 
+1

感谢Amrit,这正是我所寻找的。 – 2013-03-12 05:12:59

+0

这太棒了!谢谢 – 2015-01-13 10:28:24

+0

一个货币可以有多个符号。例如:美元对于本地“es_US”(我的VM上是Java8,Win7)也有“US $”符号。 和差额货币可以具有相同的符号,例如:USD,AUD – brabenetz 2016-09-06 08:31:24

10

您正在看到Java认为用户在您的默认语言环境期望查看货币符号。这也由Javadocs确认getSymbol()

获取此货币的默认语言环境的符号。例如,对于美元,如果默认区域设置为美国,则符号为“$”,而对于其他区域设置,可以是“美元”。如果没有符号可以确定,则返回ISO 4217货币代码。

通过改变你的默认语言环境:

Locale.setDefault(Locale.UK); // e.g. 

您可以在实验中证明自己这一点。 (注意:我不是说这是一个解决方案,只是一个机会,让你检查其他语言环境参见)。

我建议你坚持任何Java认为适合您的默认语言环境 - 我相信它是您的用户可以理解的。


这似乎吸引力寻求每个货币“正常”的货币符号,但是看看下面的货币列表:http://www.xe.com/symbols.php

看看有多少个国家用$符号来识别他们的货币。埃及也使用英镑符号(£)。语言环境货币符号背后的全部想法是为您提供一个字符串,用户在您的区域将理解。

+0

设置默认本地英国给我的欧元符号,但现在我没有得到美元符号。 – 2013-02-27 07:50:24

+0

默认的语言环境可能非常好*不是*用户的语言环境 - 尽管webapp ... – 2013-02-27 07:50:29

+1

@JonSkeet但这对webapps来说总是一个挑战。甚至下到应该考虑的时间。我会认为大多数webapps被固定到一个语言环境(在一个“处理它,用户”的感觉)或将允许用户选择一个区域,时区等。 – 2013-02-27 07:52:20

3

一个简单的解决方案,基于Amrit Raj Sharma的回答是:

只需添加该语言环境作为getSymbol()方法的参数。

因此,改变你的代码:使用

import java.util.Currency; 
import java.util.Locale; 

public class CurrencyFormat 
{ 
    public void displayCurrencySymbols() 
    { 
    Currency currency = Currency.getInstance(Locale.US); 
    System.out.println("United States: " + currency.getSymbol(Locale.US)); 
    } 
    public static void main(String[] args) 
    { 
    new CurrencyFormat().displayCurrencySymbols(); 
    } 
} 
+0

不适用于其他货币。例如。它会显示哥伦比亚比索的“COP”而不是“$” – 2017-01-20 15:09:41

相关问题