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