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

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

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

Тогда вместо символа он дает код страны. Почему это так и как мы можем получить символы?

РЕДАКТИРОВАТЬ: Посмотрев какой-то ответ, я хотел бы уточнить, что установка определенного локального значения по умолчанию не является решением, поскольку мне нужно, чтобы все доступные знаки отображались одновременно.

e.g.

 Locale.setDefault(Locale.UK); 

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


person Ram Dutt Shukla    schedule 27.02.2013    source источник
comment
Я получаю USD, а не $, используя последнюю версию Java 7 в Windows 7. Однако мой язык по умолчанию — британский. Для Германии я вижу знак евро, а для Великобритании я вижу знак фунта стерлингов.   -  person Duncan Jones    schedule 27.02.2013
comment
Какую версию Java вы используете?   -  person Jon Skeet    schedule 27.02.2013
comment
Если я установлю Locale.setDefault(Locale.US);, я получу те же результаты, что и вы.   -  person Duncan Jones    schedule 27.02.2013
comment
То же самое и со мной, я получаю USD для локали США и для ГЕРМАНИИ. Я сижу за Mac с немецкими настройками. (А для Великобритании я получаю GBP. Код, выполненный на eclipse Juno SR1)   -  person Andreas Dolk    schedule 27.02.2013
comment
@JonSkeet: это Java 1.6   -  person Ram Dutt Shukla    schedule 27.02.2013
comment
Чего вы пытаетесь достичь, точно? Возможно, вы просто хотите передать ту же локаль в getSymbol, чтобы получить представление, которое кто-то из этой локали будет использовать для своей валюты?   -  person Jon Skeet    schedule 27.02.2013
comment
@RamDuttShukla Для пояснения, когда вы говорите это дает код страны, что именно вы имеете в виду? Вы видите EUR для Германии?   -  person Duncan Jones    schedule 27.02.2013
comment
@JonSkeet: я отредактировал свой вопрос, чтобы он был более ясным   -  person Ram Dutt Shukla    schedule 27.02.2013
comment
@JonSkeet: Да, я вижу евро для Германии. JPY для ЯПОНИИ и так далее   -  person Ram Dutt Shukla    schedule 27.02.2013
comment
@RamDuttShukla: Верно. Вам следует снова отредактировать вопрос, так как EUR не является кодом страны...   -  person Jon Skeet    schedule 27.02.2013
comment
Если вам очень, очень, очень нужен родной символ для каждой валюты, вы можете сказать String symbolFor(Locale l) {return Currency.getInstance(l).getSymbol(l);}. Но вы почти наверняка не хотите.   -  person Tom Anderson    schedule 27.02.2013


Ответы (3)


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

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.
person Amrit Raj Sharma    schedule 11.03.2013
comment
Спасибо, Амрит, это именно то, что я искал. - person Ram Dutt Shukla; 12.03.2013
comment
Одна валюта может иметь несколько символов. Например: доллар США также имеет символ доллара США для локального es_US (Java8, Win7 на моей виртуальной машине). И разные валюты могут иметь одинаковые символы, например: USD, AUD. - person Harald Brabenetz; 06.09.2016

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

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

Изменив локаль по умолчанию:

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

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

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


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

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

person Duncan Jones    schedule 27.02.2013
comment
Установка локального значения по умолчанию для Великобритании дает мне знак ЕВРО, но теперь я не получаю знак $. - person Ram Dutt Shukla; 27.02.2013
comment
Хотя локаль по умолчанию вполне может не быть локалью пользователя - подумайте о веб-приложении... - person Jon Skeet; 27.02.2013
comment
@JonSkeet Но это всегда будет проблемой для веб-приложений. Даже до того, каким временем следует считать. Я бы подумал, что большинство веб-приложений либо привязаны к локали (в смысле, с точки зрения пользователя), либо позволяют пользователю выбирать локаль, часовой пояс и т. д. - person Duncan Jones; 27.02.2013
comment
В любом случае, это кажется неправильным подходом к получению знака $ для валюты США на всех машинах. Но полезно знать/помнить. Если мы полагаемся на неверное предположение, что получаем $ таким образом, программное обеспечение может дать сбой на других машинах. - person Andreas Dolk; 27.02.2013
comment
@Andreas_D Для многих стран $ все равно означает что-то другое. В Австралии, например, или Гонконге. - person Duncan Jones; 27.02.2013
comment
@DuncanJones: я отредактировал свой вопрос, чтобы получить от вас четкую информацию. Благодарность - person Ram Dutt Shukla; 27.02.2013
comment
Да, конечно, ты прав. $ неоднозначно. Таким образом, есть веская причина использовать символ валюты фактической локали. И еще одна веская причина не менять локаль только для получения $ за валюту США на всех машинах ;) - person Andreas Dolk; 27.02.2013

Более простое решение, основанное на ответе 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();
  }
}
person Noam Nelke    schedule 01.06.2014
comment
Не работает для других валют. Например. он будет отображать COP для колумбийского песо вместо $ - person McSullivan; 20.01.2017