如何指定GWT的NumberFormat使用的千位和小数分隔符

时间:2012-03-21 13:48:19

标签: gwt number-formatting

在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“无论用户的语言环境是什么。

3 个答案:

答案 0 :(得分:4)

解决这个问题需要一些工作。对于NumberFormatter的docssource,看起来只有Locales可用于设置这些值。他们确实说你可以设置组分隔符,但没有这样的例子适合我。虽然您可能认为在底部执行此操作的Java方法可行,因为GWT会模拟DecimalFormatDecimalFormalSymbols类,但它们不会formally support它们。也许他们将在未来。此外,他们在LocaleInfo class中说你可以修改一个语言环境,我发现没有这样的方法允许这样做。

所以,这是 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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

我使用的方式是以这种方式覆盖GWT LocaleInfoImpl

  1. 看看LocaleInfo,您可以看到它使用了使用GWT.create(LocaleInfoImpl.class)构建的私有静态实例LocaleInfo line 36
  2. 使用GWT Deferred binding我们可以通过自定义实现覆盖LocalInfoImpl:
  3. <replace-with class="your.app.package.to.CustomLocaleInfoImpl">
      <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" />
    </replace-with>
    
    1. 以类似的方式扩展LocaleInfoImpl,只是覆盖方法getNumberConstant
    2. 
      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();
                  }
              };
          }
      }