Подтвердить что ты не робот

Не получать символы валюты для определенного языка

Я пытаюсь получить символы валют на основе их Locale. Но вместо того, чтобы возвращать символ, он возвращает код. У меня есть фрагмент:

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

даст мне знак евро, но для doller он даст код вместо знака doller ($).

4b9b3361

Ответ 1

привет, пожалуйста, попробуйте следующий код

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.

Ответ 2

Вы видите, что Java думает, что пользователи в локали по умолчанию ожидают увидеть символ валюты. Это также подтверждается Javadocs для getSymbol():

Возвращает символ этой валюты для языкового стандарта по умолчанию. Например, для доллара США символ "$", если стандартным языковым стандартом является США, тогда как для других мест он может быть "US $". Если символ не может быть определен, возвращается код валюты ISO 4217.

Изменив языковой стандарт по умолчанию:

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

Вы можете поэкспериментировать, чтобы доказать это сами. (Примечание: я не предполагаю, что это решение, просто возможность проверить, что видят другие локали).

Я бы порекомендовал вам придерживаться того, что Java считает подходящим для вашего локали по умолчанию - я уверен, что это понятно вашим пользователям.


Может показаться привлекательным искать "нормальный" символ валюты для каждой валюты, однако посмотрите на следующий список валют: http://www.xe.com/symbols.php.

Посмотрите, сколько стран признают свою валюту символом $. Египет также использует символ британского фунта (£). Вся идея символа валюты локали - дать вам строку, которую поймут пользователи в вашей локали.

Ответ 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();
  }
}