Правильный формат валюты, когда не отображается собственная валюта культуры - PullRequest
15 голосов
/ 12 мая 2009

Как правильно отформатировать валюту, если вы форматируете валюту, которая не является национальной валютой текущей культуры?

Например, если я форматирую доллары США для культуры fr-FR, я форматирую ее как культуру en-US ( $ 1,000.00 ) или как культуру fr-FR, но меняя символ евро на символ доллара США ( 1 000,00 $ ). Возможно что-то еще ( $ 1 000,00 или 1 000,00 USD )?

Ответы [ 2 ]

29 голосов
/ 12 мая 2009

Здесь нет абсолютных правил, но есть пара руководящих принципов:

  1. Попробуйте использовать числовой формат для этой локали (например, 1000,00 в США будет отображаться как 1 000,00 в Германии);
  2. Помните, что разные валюты могут использовать один и тот же символ (например, $ используется в австралийских и американских долларах) и что много символов валюты ;
  3. Если ваш сайт «единая» валюта, просто используйте правильный символ для этой валюты. Под этим я подразумеваю такие сайты, как Amazon, туристические сайты, магазины и т. Д. Эти сайты являются единой валютой в том смысле, что они одна валюта за раз . Например, они не будут одновременно показывать малайзийские ринги и сингапурские доллары; и
  4. Если ваш сайт мультивалютный, то вообще не используйте этот символ: используйте международный стандартный трехбуквенный код валюты, как определено Имена валют ISO 4217 и элементы кода . Сайты типа xe.com вписываются в категорию.
0 голосов
/ 08 июня 2010

Если вы всегда хотите отобразить символ, вот служебный класс:

public class Utils {

    public static SortedMap<Currency, Locale> currencyLocaleMap;

    static {
        currencyLocaleMap = new TreeMap<Currency, Locale>(new Comparator<Currency>() {
            @Override
            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  getAmountAsFormattedString(Double amount, Double decimals, String currencyCode) {
        Currency currency = Currency.getInstance(currencyCode);
        double doubleBalance = 0.00;
        if (amount != null) {
            doubleBalance = ((Double) amount) / (Math.pow(10.0, decimals));
        }
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance(currencyLocaleMap.get(currency));
        return numberFormat.format(doubleBalance);
    }

    public static String getCurrencySymbol(String currencyCode) {
        Currency currency = Currency.getInstance(currencyCode);
        return currency.getSymbol(currencyLocaleMap.get(currency));
    }


}
...