Diğerlerinin dediği gibi, bu sınıfı projeme ekledim ve filtreyi EditTextistediğim şekilde ayarladım .
Filtre, @ Pixel'in cevabından kopyalanır. Ben sadece hepsini bir araya getiriyorum.
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter() {
mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String formatedSource = source.subSequence(start, end).toString();
String destPrefix = dest.subSequence(0, dstart).toString();
String destSuffix = dest.subSequence(dend, dest.length()).toString();
String result = destPrefix + formatedSource + destSuffix;
result = result.replace(",", ".");
Matcher matcher = mPattern.matcher(result);
if (matcher.matches()) {
return null;
}
return "";
}
}
Şimdi filtreyi şu şekilde ayarlayın EditText.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Burada önemli bir şey, ondalık noktadan sonra ikiden fazla basamağın gösterilmesine izin vermeme sorunumu çözmesidir, EditTextancak sorun şu getText()ki EditText, bundan sonra yazdığım tüm girdiyi döndürür.
Örneğin, filtreyi üzerine uyguladıktan sonra EditText, 1.5699856987 girişini ayarlamaya çalıştım. Yani ekranda mükemmel olan 1.56'yı gösteriyor.
Sonra bu girdiyi başka hesaplamalar için kullanmak istedim, bu yüzden metni o girdi alanından ( EditText) almak istedim . Ben çağrıldığında mEditText.getText().toString()o benim durumumda kabul edilebilir değildi 1,5699856987 döndürür.
Bu yüzden, .tml dosyasından aldıktan sonra değeri tekrar ayrıştırmak zorunda kaldım EditText.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScaleburada tam metni aldıktan sonra hile yapıyor EditText.