Не получение символов валюты для определенной локали
Я пытаюсь получить символы валют на основе их языка. Но вместо того, чтобы возвращать символ, он возвращает код. У меня есть фрагмент:
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();
}
}
для Локаль.Нас это дает символ $
но если я заменить
Currency currency = Currency.getInstance(Locale.US);
С
Currency currency = Currency.getInstance(Locale.GERMANY);
тогда вместо символа он дает код страны. Почему это и как мы можем получить символы?
EDIT: после поиска ответа я бы как очистить, что установка определенного локального по умолчанию не является решением как мне нужно, чтобы все avalaible знак отображается сразу.
например
Locale.setDefault(Locale.UK);
даст мне знак евро, но для doller он даст код вместо знака doller ($).
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.
вы видите, что Java думает о пользователях в вашей локали по умолчанию ожидал чтобы увидеть символ валюты. Это также подтверждается Javadocs для getSymbol()
:
получает символ этой валюты для локали по умолчанию. Например, для доллара США символ"$", если локаль по умолчанию-США, в то время как для других локалей он может быть "US$". Если символ не может быть определен, возвращается код валюты ISO 4217.
изменение ваш язык по умолчанию:
Locale.setDefault(Locale.UK); // e.g.
вы можете экспериментировать, чтобы доказать это для себя. (примечание: Я не предполагаю, что это решение, просто возможность для вас проверить, какие другие локали видят).
Я бы рекомендовал вам придерживаться того, что Java считает подходящим для вашей локали по умолчанию - я уверен, что это понятно вашим пользователям.
может показаться привлекательным искать" нормальный " символ валюты для каждой валюты, однако возьмите смотрите ниже список валюта: http://www.xe.com/symbols.php.
посмотрите, сколько стран признают свою валюту с $
символ. Египет также использует символ британского фунта (£
). Вся идея символа валюты локали заключается в том, чтобы дать вам строку, которую пользователи в ваш язык поймет.
более простое решение, основанное на Амрит Радж Шарма'ы ответ:
просто добавьте локаль в качестве параметра в 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();
}
}