2013-02-27 72 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

相關問題