Форматирование валюты Канадский английский и французский языки

У меня есть требование установить значение на основе локали. Я получу локаль либо en_US, либо fr_FR

 String locale = object.getLocale();  //

Затем в зависимости от локали мне нужно определить валюту. Формат валюты, который мне нужен, определен ниже.

   Language            Example             Notes
   Canadian French     123.456.789,99 $    symbol is a suffix,'comma' for decimal
   Canadian English    $123,456,789.99      symbol is a prefix,'dot' for decimal

В настоящее время у меня есть атрибуты формы, значения которых я напрямую устанавливаю в своем классе Java.

  ...
  Form form = new Form();
    // Stub data for generating a graph.
    formBean.setCurrOne("123.54");
    formBean.setCurrTwo("456.33");
          ....//before I set those attributes I need to place a check
              // for locale and format the currency accordingly.

Помогите пожалуйста с форматом. Также есть разница , и . в формате валюты.


person Some Java Guy    schedule 26.12.2011    source источник


Ответы (2)


NumberFormat canadaFrench = NumberFormat.getCurrencyInstance(Locale.CANADA_FRENCH);
NumberFormat canadaEnglish = NumberFormat.getCurrencyInstance(Locale.CANADA);

BigDecimal amount = new BigDecimal("123456789.99");

System.out.println(canadaFrench.format(amount));
System.out.println(canadaEnglish.format(amount));

Результат:

123 456 789,99 $
$123,456,789.99

Если вы действительно не хотите использовать формат по умолчанию (с пробелами в качестве разделителя тысяч, а не точек), используйте

DecimalFormatSymbols symbols = ((DecimalFormat) canadaFrench).getDecimalFormatSymbols();
symbols.setGroupingSeparator('.');
((DecimalFormat) canadaFrench).setDecimalFormatSymbols(symbols);

Видите ли, все это сделает за вас класс NumberFormat, при условии, что вы укажете ему правильную локаль. fr_FR означает французский язык во Франции, а не французский язык в Канаде. Для этого вам понадобится fr_CA. И en_US означает английский язык Соединенных Штатов, а не английский язык Канады. Для этого вам нужен en_CA.

person JB Nizet    schedule 26.12.2011
comment
Можно ли это сделать на org.springframework.format.number.CurrencyFormatter ЛЮБОМ примере? - person Some Java Guy; 28.12.2011

Joda Money предоставляет хорошую модель денег, поддерживающую специализированное форматирование для разных валют. Пример кода:

CurrencyUnit canadianFrench = CurrencyUnit.getInstance(Locale.CANADA_FRENCH);
CurrencyUnit canadianEnglish = CurrencyUnit.getInstance(Locale.CANADA);

MoneyFormatter canadianFrenchFormat = new MoneyFormatterBuilder().
        appendAmount(MoneyAmountStyle.ASCII_DECIMAL_COMMA_GROUP3_DOT).
        appendLiteral(" $").
        toFormatter();
MoneyFormatter canadianEnglishFormat = new MoneyFormatterBuilder().
        appendLiteral("$").
        appendAmount(MoneyAmountStyle.ASCII_DECIMAL_POINT_GROUP3_COMMA).
        toFormatter();

System.out.println(canadianFrenchFormat.print(Money.of(canadianFrench, 123456789.99)));
System.out.println(canadianEnglishFormat.print(Money.of(canadianEnglish, 123456789.99)));

Немного многословно, да :)

person Ophir Radnitz    schedule 27.12.2011
comment
Можно ли это сделать с помощью org.springframework.format.number.CurrencyFormatter ?? Любая помощь - person Some Java Guy; 28.12.2011
comment
Этот ответ действительно полезен, один вопрос, который я хотел бы задать, заключается в том, как мы можем добавить средство форматирования для отрицательной суммы? Мне нужно (900.00,00) в случае -90000.00 - person MrYo; 15.07.2015
comment
@Sanjaya Pandey Кажется, нет способа сделать это с помощью joda-money (v0.10). Вы можете установить отрицательный символ в MoneyAmountStyle, но это не поможет в том форматировании, которое вы ищете. - person Ophir Radnitz; 22.07.2015