Je travaille actuellement sur un projet GWT où nous utilisons les librairies Sencha GXT. J'essaie actuellement de créer un CurrencyField avec un format monétaire personnalisé. Voici quelques exemples de la façon dont je veux que mon format personnalisé monnaie:Sencha GXT Custom CurrencyFormat pour le champ de saisie
€ 123,45
€ 98.765.432,10
€ 400,00
Donc, comme vous pouvez le voir, je veux un euro signe préfixe; un espace entre le symbole monétaire et la décimale; points pour mille séparateurs; et des virgules pour les décimales (et bien sûr deux décimales derrière la virgule).
Dans GXT, il semble toutefois qu'il n'est pas possible de créer votre propre format personnalisé.
Je sais avec le java.text.NumberFormat
que je peux faire quelque chose comme régulier ceci:
NumberFormat format = NumberFormat.getCurrencyInstance();
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("€");
formatSymbols.setGroupingSeparator('.');
formatSymbols.setMonetaryDecimalSeparator(',');
((DecimalFormat)format).setDecimalFormatSymbols(formatSymbols);
En GXT cependant, le com.google.gwt.i18n.client.NumberFormat
doit être utilisé pour la setFormat
-method du NumberField<BigDecimal>
. Je sais une certaine personnalisation peut être utilisé avec le CurrencyData
comme ceci:
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;
}
};
}
que j'utilise maintenant comme ceci:
NumberField<BigDecimal> currencyField = new NumberField<BigDecimal>(
new NumberPropertyEditor.BigDecimalPropertyEditor());
currencyField.setFormat(NumberFormat.getCurrencyFormat(createCurrencyData()));
cependant deux problèmes:
- Ce n'est pas entièrement personnalisé comment je le veux. Il accepte maintenant les entrées comme ceci:
€123,456.78
; au lieu de€ 123.456,78
(aussi, même si leCurrencyData#isSpacingForced
devrait apparemment être utilisé pour un espace entre le symbole monétaire et décimal, il ne fonctionne pas sur leNumberField
..) - Quand je viens de taper un numéro régulier comme
400
, il donne une erreur au lieu de formatage automatique de l'entrée utilisateur:400 does not have either positive or negative affixes is not a valid number
.