【问题标题】:GWT - How to change NumberConstants in NumberFormatGWT - 如何更改 NumberFormat 中的 NumberConstants
【发布时间】: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() 永远不会被执行。

我做错了什么?

【问题讨论】:

    标签: java gwt number-formatting


    【解决方案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 构造函数注释。
    猜你喜欢
    • 2013-06-24
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多