В настоящее время я работаю над проектом GWT, где мы используем библиотеки Sencha GXT. В настоящее время я пытаюсь создать CurrencyField с настраиваемым валютным форматом. Некоторые примеры того, как я хочу, чтобы мой собственный формат валюты:Sencha GXT Custom CurrencyFormat для ввода-поля
€ 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
должен быть использован для setFormat
-метода NumberField<BigDecimal>
. Я знаю, что некоторые настройки могут быть использованы с 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
.