Diğerlerinin dediği gibi, bu sınıfı projeme ekledim ve filtreyi EditText
istediğ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, EditText
ancak 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);
setScale
burada tam metni aldıktan sonra hile yapıyor EditText
.