【发布时间】:2016-02-16 09:14:12
【问题描述】:
我目前正在开发一个使用 Sencha GXT 库的 GWT 项目。我目前正在尝试使用自定义货币格式创建 CurrencyField。我想要自定义货币格式的一些示例:
€ 123,45
€ 98.765.432,10
€ 400,00
所以,如您所见,我想要一个前缀欧元符号;货币符号和小数点之间的空格;千分隔符的点;和逗号表示小数(当然还有逗号后面的两位小数)。
但在 GXT 中似乎无法创建自己的自定义格式。我知道使用常规的 java.text.NumberFormat 我可以这样做:
NumberFormat format = NumberFormat.getCurrencyInstance();
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("€");
formatSymbols.setGroupingSeparator('.');
formatSymbols.setMonetaryDecimalSeparator(',');
((DecimalFormat)format).setDecimalFormatSymbols(formatSymbols);
然而,在 GXT 中,com.google.gwt.i18n.client.NumberFormat 必须用于NumberField<BigDecimal> 的setFormat 方法。我知道一些自定义可以与CurrencyData 一起使用,如下所示:
private CurrencyData createCurrencyData() {
// CurrencyData docs: http://www.gwtproject.org/javadoc/latest/com/google/gwt/i18n/client/CurrencyData.html
return new CurrencyData() {
@Override
public String getCurrencySymbol() {
return "€";
}
@Override
public String getSimpleCurrencySymbol() {
return "€";
}
@Override
public String getPortableCurrencySymbol() {
return "€";
}
@Override
public String getCurrencyCode() {
return "EUR"; // ISO4217 for this currency
}
@Override
public int getDefaultFractionDigits() {
return 2; // Amount of decimal positions
}
@Override
public boolean isSymbolPrefix() {
return true; // true to place currency symbol before the decimal
}
@Override
public boolean isSymbolPositionFixed() {
return true; // true to use the same currency symbol position regardless of locale (determined by the isSymbolPrefix-method)
}
@Override
public boolean isSpacingFixed() {
return true; // true to put a space between the currency symbol and the decimal
}
@Override
public boolean isSpaceForced() {
return true; // true to use the same spacing regardless of locale (determined by the isSpacingFixed-method)
}
@Override
public boolean isDeprecated() {
return false;
}
};
}
我现在这样使用:
NumberField<BigDecimal> currencyField = new NumberField<BigDecimal>(
new NumberPropertyEditor.BigDecimalPropertyEditor());
currencyField.setFormat(NumberFormat.getCurrencyFormat(createCurrencyData()));
但是有两个问题:
- 它没有完全按照我想要的方式定制。它现在接受这样的输入:
€123,456.78;而不是€ 123.456,78(另外,即使CurrencyData#isSpacingForced显然应该用于货币符号和小数之间的空格,它也不适用于NumberField..) - 当我只输入像
400这样的常规数字时,它会给出错误而不是自动格式化用户输入:400 does not have either positive or negative affixes is not a valid number。
【问题讨论】:
标签: java gwt formatting currency gxt