如何指定GWT'使用的千位和十进制分隔符;s数字格式
在GWT的NumberFormat类的文档中(http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n/client/NumberFormat.html)我读到: “用于无穷大、数字、千位分隔符、十进制分隔符等的前缀、后缀和各种符号可以设置为任意值,,它们在格式化过程中会正确显示。”。但是,必须注意符号和字符串不冲突,否则解析将不可靠。例如,十进制分隔符和千位分隔符应该是不同的字符,否则将无法进行解析。” 我的问题是,如何确保“.”独立于用户的区域设置用作千位分隔符,“.”独立于用户的区域设置用作十进制分隔符?如何指定GWT'使用的千位和十进制分隔符;s数字格式,gwt,number-formatting,Gwt,Number Formatting,在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”“不管用户的区域设置是什么。解决这个问题需要一些工作。从和for NumberFormatter中,似乎只能使用区域设置来设置这些值。他们确实说你可以设置组分隔符,但这样的例子对我不起作用。虽然您可能认为底层的Java方法可以做到这一点,因为GWT模拟了and类,但它们不模拟and类。也许将来会。此外,他们说在你可以修改语言环境中,我发现没有这样的方法允许这样做 因此,这里有一个黑客方法来做这件事:
NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@");
方法正确,但GWT尚未支持:
NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@");
使用十进制格式化程序:
// 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
我只是遇到了同样的问题。我是这样解决的:
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, ".");
}
我使用的方法是通过以下方式覆盖GWT的
localeInfo impl
:
GWT.create(LocaleInfo impl.class)
当尝试使用DecimalFormat时,我得到:“类'java.text.DecimalFormat'在JRE仿真库中不存在,因此无法在客户端代码中使用”。Dang。。。奇怪,因为它是模仿的。我将发布到GWT开发者。更新到我的最终答案。看起来GWT正计划支持这一点,但尚未这样做。看看我建议的黑客。这是一个非常好的解决方案,但我不能让它工作。似乎GWT不执行规则,我不知道为什么。我正在使用GWT 2.8.1我也在使用2.8.1,它对我很有用,也许你可以添加一些日志来跟踪我在这里发布的执行情况,我所能做的就是:。如果你有一些想法,请发表评论。
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();
}
};
}
}