ठीक है, यहां करेंसी फॉर्मेट, डिलीट-बैकवर्ड कीस्ट्रोक से निपटने का बेहतर तरीका है। कोड ऊपर @androidcurious 'कोड पर आधारित है ... लेकिन, पिछड़े-विलोपन से संबंधित कुछ समस्याओं और कुछ पार्स अपवादों से संबंधित है:
http://miguelt.blogspot.ca/2013/01/textwatcher-for-currency-masksformatting । html
[अद्यतन] पिछले समाधान में कुछ समस्याएं थीं ... यह एक बेहतर समाधान है: http://miguelt.blogspot.ca/2013/02/update-textwatcher-for-currency.html
और ... यहाँ हैं विवरण:
यह दृष्टिकोण बेहतर है क्योंकि यह पारंपरिक Android तंत्र का उपयोग करता है। विचार उपयोगकर्ता के मौजूद होने के बाद मूल्यों को प्रारूपित करने के लिए है।
संख्यात्मक मानों को प्रतिबंधित करने के लिए एक InputFilter को परिभाषित करें - यह ज्यादातर मामलों में आवश्यक है क्योंकि स्क्रीन लंबे समय तक संपादित करने के लिए पर्याप्त नहीं है। यह एक स्थिर आंतरिक वर्ग या सिर्फ एक सादा वर्ग हो सकता है:
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 "";
}
}
एक वर्ग (आंतरिक स्थिर या सिर्फ एक वर्ग) को परिभाषित करें जो View.OnFocusChangeListener को लागू करेगा। ध्यान दें कि मैं यूटिल्स क्लास का उपयोग कर रहा हूं - कार्यान्वयन "एमाउंट, टैक्स" पर पाया जा सकता है।
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);
}
}
}
यह कक्षा मानक तंत्रों पर निर्भर करते हुए संपादन करते समय मुद्रा प्रारूप को हटा देगी। जब उपयोगकर्ता बाहर निकलता है, तो मुद्रा प्रारूप फिर से लागू होता है।
उदाहरणों की संख्या को कम करने के लिए कुछ स्थिर चर को परिभाषित करना बेहतर है:
static final InputFilter[] FILTERS = new InputFilter[] {new NumericRangeFilter()};
static final View.OnFocusChangeListener ON_FOCUS = new AmountOnFocusChangeListener();
अंत में, onCreateView (...) के भीतर:
EditText mAmountView = ....
mAmountView.setFilters(FILTERS);
mAmountView.setOnFocusChangeListener(ON_FOCUS);
आप किसी भी संख्या में EditText के विचारों पर फ़िल्टर और ON_FOCUS का पुन: उपयोग कर सकते हैं।
यहाँ बर्तन वर्ग है:
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());
}
}