GWT - 如何更改 NumberFormat 中的 NumberConstants

Posted

技术标签:

【中文标题】GWT - 如何更改 NumberFormat 中的 NumberConstants【英文标题】:GWT - How to change NumberConstants in NumberFormat 【发布时间】:2016-01-09 11:18:30 【问题描述】:

我需要更改 NumberFormat 的 NumberConstants 中的 NaN 值和减号。 “动态”更改 NumberConstants 是不可能的,所以我决定继承 NumberFormat。

NumberFormat 的构造函数注解说:

@param numberConstants 用于特定语言环境的数字常量 这种格式 -- NOTE 子类在这里传递它们自己的实例 应注意 @link #forcedLatinDigits() 并重新映射 使用 @link #createLatinNumberConstants(NumberConstants)

的本地化符号

看来我应该调用 setForcedLatinDigits(true) 来执行 createLatinNumberConstants(NumberConstants) 方法。然后本地化的常量会被那个 (createLatinNumberConstants) 方法更新,我会得到我需要的 NumberConstants。

这是我的代码:

public class MyNumberFormat extends NumberFormat 
      protected MyNumberFormat(String pattern, CurrencyData cdata, boolean userSuppliedPattern) 
        this(defaul, pattern, cdata, userSuppliedPattern);
    

      protected MyNumberFormat(NumberConstants numberConstants, String pattern, CurrencyData cdata, boolean userSuppliedPattern) 
        super(numberConstants, pattern, cdata, userSuppliedPattern);
    

      public static MyNumberFormat getFormat(String pattern) 
        return  new MyNumberFormat(pattern, CurrencyList.get().getDefault(), true);
    

      protected static NumberConstants createLatinNumberConstants(
            final NumberConstants orig) 
        final String groupingSeparator = remapSeparator(
                orig.groupingSeparator());
        final String decimalSeparator = remapSeparator(
                orig.decimalSeparator());
        final String monetaryGroupingSeparator = remapSeparator(
                orig.monetaryGroupingSeparator());
        final String monetarySeparator = remapSeparator(
                orig.monetarySeparator());
        return new NumberConstants() 
            @Override
            public String currencyPattern() 
                return orig.currencyPattern();
            

            @Override
            public String decimalPattern() 
                return orig.decimalPattern();
            

            @Override
            public String decimalSeparator() 
                return decimalSeparator;
            

            @Override
            public String defCurrencyCode() 
                return orig.defCurrencyCode();
            

            @Override
            public String exponentialSymbol() 
                return orig.exponentialSymbol();
            

            @Override
            public String globalCurrencyPattern() 
                return orig.globalCurrencyPattern();
            

            @Override
            public String groupingSeparator() 
                return groupingSeparator;
            

            @Override
            public String infinity() 
                return orig.infinity();
            

            @Override
            public String minusSign() 
                return UnicodeSymbols.MINUS;
            

            @Override
            public String monetaryGroupingSeparator() 
                return monetaryGroupingSeparator;
            

            @Override
            public String monetarySeparator() 
                return monetarySeparator;
            

            @Override
            public String notANumber() 
                return "?";
            

            @Override
            public String percent() 
                return orig.percent();
            

            @Override
            public String percentPattern() 
                return orig.percentPattern();
            

            @Override
            public String perMill() 
                return orig.perMill();
            

            @Override
            public String plusSign() 
                return orig.plusSign();
            

            @Override
            public String scientificPattern() 
                return orig.scientificPattern();
            

            @Override
            public String simpleCurrencyPattern() 
                return orig.simpleCurrencyPattern();
            

            @Override
            public String zeroDigit() 
                return "0";
            
        ;
    
  

所以为了格式化数字我会执行这个:

String fmt(final Double x)
      MyNumberFormat.setForcedLatinDigits(true);
      MyNumberFormat format = MyNumberFormat.getFormat("0.0000");
      return format.format(x)
   

但实际上 createLatinNumberConstants 是受保护的静态方法,它不能被覆盖或替换。 所以 MyNumberFormat.createLatinNumberConstants() 永远不会被执行。

我做错了什么?

【问题讨论】:

【参考方案1】:

我认为您不需要覆盖createLatinNumberConstants - 而是将您的数字常量传递给超类的构造函数。 作为基础,您可以使用默认的数字常量NumberFormat

类似的东西应该可以工作:

public class MyNumberFormat extends NumberFormat 
    protected MyNumberFormat(String pattern, CurrencyData cdata, boolean userSuppliedPattern) 
      super(createMyNumberConstants(NumberFormat.defaultNumberConstants), pattern, cdata, userSuppliedPattern);
  

    public static MyNumberFormat getFormat(String pattern) 
      return new MyNumberFormat(pattern, CurrencyList.get().getDefault(), true);
  

protected static final NumberConstants createMyNumberConstants(
      final NumberConstants orig) 
  return new NumberConstants() 
      @Override
      public String currencyPattern() 
          return orig.currencyPattern();
      

      @Override
      public String decimalPattern() 
          return orig.decimalPattern();
      

      @Override
      public String decimalSeparator() 
          return decimalSeparator();
      

      @Override
      public String defCurrencyCode() 
          return orig.defCurrencyCode();
      

      @Override
      public String exponentialSymbol() 
          return orig.exponentialSymbol();
      

      @Override
      public String globalCurrencyPattern() 
          return orig.globalCurrencyPattern();
      

      @Override
      public String groupingSeparator() 
          return orig.groupingSeparator();
      

      @Override
      public String infinity() 
          return orig.infinity();
      

      @Override
      public String minusSign() 
          return orig.minusSign();
      

      @Override
      public String monetaryGroupingSeparator() 
          return orig.monetaryGroupingSeparator();
      

      @Override
      public String monetarySeparator() 
          return orig.monetarySeparator();
      

      @Override
      public String notANumber() 
          return "?";
      

      @Override
      public String percent() 
          return orig.percent();
      

      @Override
      public String percentPattern() 
          return orig.percentPattern();
      

      @Override
      public String perMill() 
          return orig.perMill();
      

      @Override
      public String plusSign() 
          return orig.plusSign();
      

      @Override
      public String scientificPattern() 
          return orig.scientificPattern();
      

      @Override
      public String simpleCurrencyPattern() 
          return orig.simpleCurrencyPattern();
      

      @Override
      public String zeroDigit() 
          return "0";
      
  ;

【讨论】:

谢谢你,塞巴斯蒂安!我最终编写了与您类似的代码,但我想,GWT 贡献者团队的某个人将解释 NumberFormat 构造函数注释。

以上是关于GWT - 如何更改 NumberFormat 中的 NumberConstants的主要内容,如果未能解决你的问题,请参考以下文章

GWT:如何更改浏览器选项卡名称?

GWT:如何在鼠标事件上更改菜单栏图像?

在 intellij 的 GWT 配置中更改 Super Dev Mode 端口参数

如何更新GWT中每行数据网格中其他列“qty”值更改的“总价格”列值?

在全局线程中更改 NumberFormat 分隔符后,十进制解析抛出异常 [关闭]

如何将未更改的值发送到 gwt RequestFactory 中的服务器?