【发布时间】: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