Правильный формат валюты, когда не отображается национальная валюта культуры

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

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

Ответ 1

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

  • Попробуйте использовать формат номера для этого языкового стандарта (например, 1000,00 в США будут отображаться как 1 000,00 в Германии);
  • Помните, что разные валюты могут использовать один и тот же символ (например, $используется Австралией и Долларами США) и что много символов валюты;
  • Если ваш сайт является "единой" валютой, просто используйте правильный символ для этой валюты. Под этим я подразумеваю сайты, такие как Amazon, туристические сайты, торговые площадки и так далее. Эти сайты являются единой валютой в том смысле, что они одна валюта за раз. Например, они не будут показывать малайзийские звонки и сингапурские доллары; и
  • Если ваш сайт является мультивалютным, тогда не используйте символ вообще: используйте международный код валюты с тремя буквами, как определено ISO 4217 currency имена и элементы кода. Сайты, такие как xe.com, вписываются в категорию.

Ответ 2

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

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


}