在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“无论用户的语言环境是什么。
答案 0 :(得分:4)
解决这个问题需要一些工作。对于NumberFormatter的docs和source,看起来只有Locales可用于设置这些值。他们确实说你可以设置组分隔符,但没有这样的例子适合我。虽然您可能认为在底部执行此操作的Java方法可行,因为GWT会模拟DecimalFormat和DecimalFormalSymbols类,但它们不会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
:
GWT.create(LocaleInfoImpl.class)
构建的私有静态实例LocaleInfo line 36 <replace-with class="your.app.package.to.CustomLocaleInfoImpl"> <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" /> </replace-with>
getNumberConstant
:
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();
}
};
}
}