Nie otrzymywanie symboli walutowych dla określonych ustawień regionalnych

Próbuję uzyskać symbole walut na podstawie ich lokalizacji. Ale zamiast zwracać symbol, zwraca kod. Mam fragment:

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

Dla Locale.US daje symbol $ ale jeśli zamienię

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

Z

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

Wtedy zamiast symbolu podaje się kod kraju. Dlaczego tak jest i jak możemy uzyskać symbole?

EDIT: Po szukaniu jakiejś odpowiedzi chciałbym wyczyścić, że ustawienie jakiejś konkretnej domyślnej local nie jest rozwiązaniem, ponieważ potrzebuję wszystkich dostępnych znaków wyświetlanych naraz .

Np.

 Locale.setDefault(Locale.UK); 

Da mi znak euro, ale doller da kod zamiast Doller sign ($).

Author: Ram Dutt Shukla, 2013-02-27

3 answers

Witam proszę wypróbować następujący kod

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

Wynik powyższego programu jest taki:

USD:-$
JPY:-¥
GBP:-£
INR:-Rs.
 32
Author: Amrit Raj Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-11 16:57:19

Widzisz, co użytkownicy Javy myślą w domyślnych ustawieniach regionalnych oczekują, że zobaczą symbol waluty. Jest to również potwierdzone przez Javadocs dla getSymbol():

Pobiera symbol tej waluty dla domyślnych ustawień regionalnych. Na przykład dla dolara amerykańskiego symbolem jest"$", jeśli domyślne ustawienia regionalne to USA, podczas gdy dla innych ustawień regionalnych może to być " US$". Jeśli nie można określić symbolu, zwracany jest kod waluty ISO 4217.

Zmieniając domyślną locale:

Locale.setDefault(Locale.UK); // e.g.
Możesz eksperymentować, aby to udowodnić. (Uwaga: nie sugeruję, że jest to rozwiązanie, tylko okazja, aby sprawdzić, co widzą inne lokalizacje ).

Zalecałbym trzymanie się tego, co Java uważa za odpowiednie dla domyślnych ustawień regionalnych - jestem pewien, że jest to zrozumiałe dla użytkowników.


Atrakcyjne może wydawać się szukanie "normalnego" symbolu waluty dla każdej waluty, jednak spójrz na poniższą listę walut: http://www.xe.com/symbols.php .

Zobacz, ile krajów uznaje swoją walutę za symbol $. Egipt używa również symbolu funta brytyjskiego (£). Cała idea stojąca za symbolem waluty lokalnej polega na tym, aby dać ci ciąg znaków, który użytkownicy w twoje locale zrozumieją.

 10
Author: Duncan Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-27 07:57:42

Prostsze rozwiązanie, oparte na Amrit Raj Sharma 's odpowiedź:

Wystarczy dodać locale jako parametr do metody getSymbol().

Więc zmień kod na:

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
Author: Noam Nelke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:50