web-dev-qa-db-ja.com

特定のロケールの通貨記号を取得しない

ロケールに基づいて通貨のシンボルを取得しようとしています。しかし、シンボルを返す代わりに、コードを返します。私はスニペットを持っています:

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.US); 

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

次に、シンボルの代わりに国コードを与えています。これはなぜですか、またシンボルを取得するにはどうすればよいですか?

EDIT:いくつかの回答を確認した後、特定のデフォルトのローカルを設定することは解決策ではないことを明確にしたいと思いますすべての有効な記号を一度に表示する必要があります

例えば.

 Locale.setDefault(Locale.UK); 

ユーロ記号が表示されますが、dollerの場合は、doller sign($)の代わりにコードが表示されます。

22
Ram Dutt Shukla

こんにちは次のコードを試してください

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.
34

Javaはデフォルトロケールのユーザーがexpectで通貨記号を確認すると考えています。これも確認されています。 getSymbol()のJavadocによる:

デフォルトロケールのこの通貨の記号を取得します。たとえば、米ドルの場合、デフォルトのロケールが米国の場合、記号は「$」ですが、他のロケールの場合、記号は「US $」になる場合があります。記号を判別できない場合は、ISO 4217通貨コードが返されます。

デフォルトのロケールを変更する:

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

あなたは自分でこれを証明するために実験することができます。 (注:私はこれが解決策であることを示唆していません。他のロケールが何を参照しているかを確認する機会に過ぎません)。

Javaがデフォルトのロケールに適切であると考えるものは何でも使用することをお勧めします。ユーザーが理解できると確信しています。


すべての通貨について「通常の」通貨記号を探すことは魅力的だと思われるかもしれませんが、次の通貨リストを見てください: http://www.xe.com/symbols.php

$記号を使用して、通貨を認識している国の数を確認してください。エジプトでもイギリスのポンド記号(£)が使用されています。ロケールの通貨記号の背後にある全体的なアイデアは、あなたのロケールのユーザーが理解できる文字列を与えることです。

11
Duncan Jones

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();
  }
}
3
Noam Nelke