23

ロケールに基づいて通貨の記号を取得しようとしています。ただし、シンボルを返す代わりに、コードを返しています。スニペットがあります:

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

次に、記号の代わりに国コードを指定します。これはなぜですか、またシンボルを取得する方法は?

編集:いくつかの答えを見た後、特定のデフォルトのローカルを設定することは解決策ではないことを明確にしたいと思います

例えば

 Locale.setDefault(Locale.UK); 

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

4

3 に答える 3

34

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

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.
于 2013-03-11T16:30:29.407 に答える
11

これは、デフォルトのロケールのユーザーが通貨記号に対して期待するものをJavaが認識していることを示しています。これは、Javadocによっても確認されていgetSymbol()ます。

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

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

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

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

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


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

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

于 2013-02-27T07:46:47.730 に答える
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();
  }
}
于 2014-06-01T07:39:21.020 に答える