ঠিক আছে, মুদ্রার ফর্ম্যাটগুলি, মুছুন-পশ্চাদপটে কীস্ট্রোকটি মোকাবেলার জন্য এখানে আরও ভাল উপায়। কোডটি উপরের @ অ্যান্ড্রয়েডকুরিয়াস 'কোডের উপর ভিত্তি করে ... তবে, পিছনের দিক থেকে মুছে ফেলা এবং কিছু পার্স ব্যতিক্রম সম্পর্কিত কিছু সমস্যা রয়েছে:
http://miguelt.blogspot.ca/2013/01/textwatcher-for-currency-masksformatting .html
[আপডেট] আগের সমাধানটিতে কিছু সমস্যা ছিল ... এটি একটি ভাল দ্রাবকতা: http://miguelt.blogspot.ca/2013/02/update-textwatcher-for-currency.html
এবং ... এখানে বিশদ:
এটি প্রচলিত অ্যান্ড্রয়েড প্রক্রিয়াগুলি ব্যবহার করার কারণে এই পদ্ধতিটি আরও ভাল। ব্যবহারকারীর ভিউটি উপস্থিত থাকার পরে মানগুলি ফর্ম্যাট করা উচিত।
সংখ্যার মানগুলিকে সীমাবদ্ধ করতে একটি ইনপুটফিল্টার সংজ্ঞায়িত করুন - এটি বেশিরভাগ ক্ষেত্রেই প্রয়োজন কারণ দীর্ঘ স্ক্রিনটি সম্পাদনা করার জন্য পর্দা যথেষ্ট বড় নয়। এটি একটি স্থির অভ্যন্তর শ্রেণি বা অন্য কোনও সাধারণ শ্রেণি হতে পারে:
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();
অবশেষে, অনক্রিটভিউয়ের মধ্যে (...):
EditText mAmountView = ....
mAmountView.setFilters(FILTERS);
mAmountView.setOnFocusChangeListener(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());
}
}