如何指定GWT'使用的千位和十进制分隔符;s数字格式

如何指定GWT'使用的千位和十进制分隔符;s数字格式,gwt,number-formatting,Gwt,Number Formatting,在GWT的NumberFormat类的文档中(http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n/client/NumberFormat.html)我读到: “用于无穷大、数字、千位分隔符、十进制分隔符等的前缀、后缀和各种符号可以设置为任意值,,它们在格式化过程中会正确显示。”。但是,必须注意符号和字符串不冲突,否则解析将不可靠。例如,十进制分隔符和千位分隔符应该是不同的字符,否则将无法进行解析

在GWT的NumberFormat类的文档中(http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n/client/NumberFormat.html)我读到:

“用于无穷大、数字、千位分隔符、十进制分隔符等的前缀、后缀和各种符号可以设置为任意值,,它们在格式化过程中会正确显示。”。但是,必须注意符号和字符串不冲突,否则解析将不可靠。例如,十进制分隔符和千位分隔符应该是不同的字符,否则将无法进行解析。”

我的问题是,如何确保“.”独立于用户的区域设置用作千位分隔符,“.”独立于用户的区域设置用作十进制分隔符?
换句话说,当我使用模式“##################”时,我希望GWT将双值1234567.89始终
格式化为“1.234.567,89”“不管用户的区域设置是什么。

解决这个问题需要一些工作。从和for NumberFormatter中,似乎只能使用区域设置来设置这些值。他们确实说你可以设置组分隔符,但这样的例子对我不起作用。虽然您可能认为底层的Java方法可以做到这一点,因为GWT模拟了and类,但它们不模拟and类。也许将来会。此外,他们说在你可以修改语言环境中,我发现没有这样的方法允许这样做

因此,这里有一个黑客方法来做这件事

    NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@");
方法正确,但GWT尚未支持:

    NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@");
使用十进制格式化程序:

    // 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


我只是遇到了同样的问题。我是这样解决的:

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, ".");
}

我使用的方法是通过以下方式覆盖GWT的
localeInfo impl

  • 查看一下LocaleInfo,您可以看到它使用了一个私有静态实例,该实例使用
    GWT.create(LocaleInfo impl.class)
  • 使用,我们可以通过自定义实现覆盖LocalInfo impl:

  • 当尝试使用DecimalFormat时,我得到:“类'java.text.DecimalFormat'在JRE仿真库中不存在,因此无法在客户端代码中使用”。Dang。。。奇怪,因为它是模仿的。我将发布到GWT开发者。更新到我的最终答案。看起来GWT正计划支持这一点,但尚未这样做。看看我建议的黑客。这是一个非常好的解决方案,但我不能让它工作。似乎GWT不执行规则,我不知道为什么。我正在使用GWT 2.8.1我也在使用2.8.1,它对我很有用,也许你可以添加一些日志来跟踪我在这里发布的执行情况,我所能做的就是:。如果你有一些想法,请发表评论。
    
    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();
                }
            };
        }
    }