Ok, voici une meilleure façon de gérer les formats de devises, effacer-en arrière. Le code est basé sur le code @androidcurious 'ci-dessus ... Mais, traite de certains problèmes liés à la suppression vers l'arrière et à quelques exceptions d'analyse:
http://miguelt.blogspot.ca/2013/01/textwatcher-for-currency-masksformatting .html
[UPDATE] La solution précédente avait quelques problèmes ... Ceci est une meilleure solution: http://miguelt.blogspot.ca/2013/02/update-textwatcher-for-currency.html
Et ... voici le détails:
Cette approche est meilleure car elle utilise les mécanismes Android classiques. L'idée est de mettre en forme les valeurs une fois que l'utilisateur existe dans la vue.
Définissez un InputFilter pour restreindre les valeurs numériques - cela est nécessaire dans la plupart des cas car l'écran n'est pas assez grand pour accueillir de longues vues EditText. Cela peut être une classe interne statique ou juste une autre classe ordinaire:
class NumericRangeFilter implements InputFilter {
private final double maximum;
private final double minimum;
NumericRangeFilter() {
this(0.00, 999999.99);
}
NumericRangeFilter(double p_min, double p_max) {
maximum = p_max;
minimum = p_min;
}
@Override
public CharSequence filter(
CharSequence p_source, int p_start,
int p_end, Spanned p_dest, int p_dstart, int p_dend
) {
try {
String v_valueStr = p_dest.toString().concat(p_source.toString());
double v_value = Double.parseDouble(v_valueStr);
if (v_value<=maximum && v_value>=minimum) {
return null;
}
} catch (NumberFormatException p_ex) {
}
return "";
}
}
Définissez une classe (statique interne ou juste une classe) qui implémentera View.OnFocusChangeListener. Notez que j'utilise une classe Utils - l'implémentation peut être trouvée dans "Amounts, Taxes".
class AmountOnFocusChangeListener implements View.OnFocusChangeListener {
@Override
public void onFocusChange(View p_view, boolean p_hasFocus) {
EditText v_amountView = (EditText)p_view;
if (p_hasFocus) {
String v_value = v_amountView.getText().toString();
int v_cents = Utils.parseAmountToCents(v_value);
v_value = Utils.formatCentsToAmount(v_cents);
v_amountView.setText(v_value);
v_amountView.selectAll();
} else {
String v_value = v_amountView.getText().toString();
int v_cents = Utils.parseAmountToCents(v_value);
v_value = Utils.formatCentsToCurrency(v_cents);
v_amountView.setText(v_value);
}
}
}
Cette classe supprimera le format de devise lors de l'édition - en s'appuyant sur des mécanismes standard. Lorsque l'utilisateur quitte, le format de devise est réappliqué.
Il est préférable de définir certaines variables statiques pour minimiser le nombre d'instances:
static final InputFilter[] FILTERS = new InputFilter[] {new NumericRangeFilter()};
static final View.OnFocusChangeListener ON_FOCUS = new AmountOnFocusChangeListener();
Enfin, dans le onCreateView (...):
EditText mAmountView = ....
mAmountView.setFilters(FILTERS);
mAmountView.setOnFocusChangeListener(ON_FOCUS);
Vous pouvez réutiliser FILTERS et ON_FOCUS sur n'importe quel nombre de vues EditText.
Voici la classe Utils:
public class Utils {
private static final NumberFormat FORMAT_CURRENCY = NumberFormat.getCurrencyInstance();
public static int parseAmountToCents(String p_value) {
try {
Number v_value = FORMAT_CURRENCY.parse(p_value);
BigDecimal v_bigDec = new BigDecimal(v_value.doubleValue());
v_bigDec = v_bigDec.setScale(2, BigDecimal.ROUND_HALF_UP);
return v_bigDec.movePointRight(2).intValue();
} catch (ParseException p_ex) {
try {
BigDecimal v_bigDec = new BigDecimal(p_value);
v_bigDec = v_bigDec.setScale(2, BigDecimal.ROUND_HALF_UP);
return v_bigDec.movePointRight(2).intValue();
} catch (NumberFormatException p_ex1) {
return -1;
}
}
}
public static String formatCentsToAmount(int p_value) {
BigDecimal v_bigDec = new BigDecimal(p_value);
v_bigDec = v_bigDec.setScale(2, BigDecimal.ROUND_HALF_UP);
v_bigDec = v_bigDec.movePointLeft(2);
String v_currency = FORMAT_CURRENCY.format(v_bigDec.doubleValue());
return v_currency.replace(FORMAT_CURRENCY.getCurrency().getSymbol(), "").replace(",", "");
}
public static String formatCentsToCurrency(int p_value) {
BigDecimal v_bigDec = new BigDecimal(p_value);
v_bigDec = v_bigDec.setScale(2, BigDecimal.ROUND_HALF_UP);
v_bigDec = v_bigDec.movePointLeft(2);
return FORMAT_CURRENCY.format(v_bigDec.doubleValue());
}
}