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的主要内容,如果未能解决你的问题,请参考以下文章
在 intellij 的 GWT 配置中更改 Super Dev Mode 端口参数
如何更新GWT中每行数据网格中其他列“qty”值更改的“总价格”列值?