Как указать разделитель тысяч и десятичных знаков, используемый NumberFormat GWT - PullRequest
7 голосов
/ 21 марта 2012

В документе класса NumberFormat GWT (http://google -web-toolkit.googlecode.com / svn / javadoc / 1.5 / com / google / gwt / i18n / client / NumberFormat.html) я прочитал:

"Префиксы, суффиксы и различные символы, используемые для бесконечности, цифр, разделителей тысяч, десятичных разделителей и т. Д. могут быть установлены на произвольные значения , и они будет отображаться правильно во время форматирования. Однако следует позаботиться о том, чтобы символы и строки не конфликтовали, иначе синтаксический анализ будет ненадежным. Например, десятичный разделитель и разделитель тысяч должны быть разными символами, иначе анализ будет невозможен. "

Мой вопрос: как мне убедиться, что "." используется в качестве разделителя тысяч и "," в качестве десятичного разделителя независимо от настроек локали пользователя? Другими словами, когда я использую шаблон "###, ###, ###. ######", я хочу, чтобы GWT форматировал двойное значение 1234567.89 всегда как "1.234.567, 89 "независимо от локали пользователя.

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Решение этого заняло некоторую работу.Из документов и источника для NumberFormatter, похоже, что только Locales могут использоваться для установки этих значений.Они говорят, что вы можете установить разделитель групп , но такие примеры для меня не сработали.Хотя вы можете подумать, что Java-способ сделать это снизу будет работать, так как GWT эмулирует классы DecimalFormat и DecimalFormalSymbols , они формально не поддерживают их .Возможно, они будут в будущем.Кроме того, в LocaleInfo классе говорят, что вы можете изменить локаль, я не нашел таких методов, позволяющих это.

Итак, вот Hack способ сделать это :

    NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@");

Правильный путь, но пока не поддерживается GWT :

Использовать десятичный форматер:

    // formatter
    DecimalFormat format= new DecimalFormat();
    // custom symbol
    DecimalFormatSymbols customSymbols=new DecimalFormatSymbols();
    customSymbols.setGroupingSeparator('@');
    format.setDecimalFormatSymbols(customSymbols);
    // test
    String formattedString = format.format(2342442.23d);

Вывод:

2 @ 342 @ 442.23

3 голосов
/ 20 августа 2013

Я только что столкнулся с той же проблемой.Я решил это так:

public String formatAmount(Double amount) {
    String pattern = "#,##0.00";
    String groupingSeparator = LocaleInfo.getCurrentLocale().getNumberConstants().groupingSeparator();
    String decimalSeparator = LocaleInfo.getCurrentLocale().getNumberConstants().decimalSeparator();
    NumberFormat format = NumberFormat.getFormat(pattern);
    return format.format(amount).replace(groupingSeparator, "'").replace(decimalSeparator, ".");
}
0 голосов
/ 12 июля 2017

Я использовал способ переопределения GWT LocaleInfoImpl следующим образом:

  1. Взглянув на LocaleInfo, вы можете увидеть, что он использует частный статический экземпляр LocaleInfo line 36 , которые строят, используя GWT.create(LocaleInfoImpl.class)
  2. Используя GWT Отложенное связывание , мы можем переопределить LocalInfoImpl пользовательской реализацией:
<replace-with class="your.app.package.to.CustomLocaleInfoImpl">
  <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" />
</replace-with>
Расширьте LocaleInfoImpl аналогичным образом, просто переопределив метод getNumberConstant:

public class CustomLocaleInfoImpl extends LocaleInfoImpl {

    @Override
    public NumberConstants getNumberConstants() {
        final NumberConstants nc = super.getNumberConstants();
        return new NumberConstants() {
            @Override
            public String notANumber() {
                return nc.notANumber();
            }

            @Override
            public String currencyPattern() {
                return nc.currencyPattern();
            }

            @Override
            public String decimalPattern() {
                return nc.decimalPattern();
            }

            @Override
            public String decimalSeparator() {
                return nc.decimalSeparator();
            }

            @Override
            public String defCurrencyCode() {
                return nc.defCurrencyCode();
            }

            @Override
            public String exponentialSymbol() {
                return nc.exponentialSymbol();
            }

            @Override
            public String globalCurrencyPattern() {
                return nc.globalCurrencyPattern();
            }

            @Override
            public String groupingSeparator() {
                return "@";//or any custom separator you desire
            }

            @Override
            public String infinity() {
                return nc.infinity();
            }

            @Override
            public String minusSign() {
                return nc.minusSign();
            }

            @Override
            public String monetaryGroupingSeparator() {
                return nc.monetaryGroupingSeparator();
            }

            @Override
            public String monetarySeparator() {
                return nc.monetarySeparator();
            }

            @Override
            public String percent() {
                return nc.percent();
            }

            @Override
            public String percentPattern() {
                return nc.percentPattern();
            }

            @Override
            public String perMill() {
                return nc.perMill();
            }

            @Override
            public String plusSign() {
                return nc.plusSign();
            }

            @Override
            public String scientificPattern() {
                return nc.scientificPattern();
            }

            @Override
            public String simpleCurrencyPattern() {
                return nc.simpleCurrencyPattern();
            }

            @Override
            public String zeroDigit() {
                return nc.zeroDigit();
            }
        };
    }
}
...