Jak powiedzieli inni, dodałem tę klasę do mojego projektu i ustawiłem filtr na EditText
chcę.
Filtr jest kopiowany z odpowiedzi @ Pixel. Po prostu składam to wszystko razem.
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 "";
}
}
Teraz ustaw filtr w EditText
ten sposób.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Tutaj jedna ważna rzecz polega na tym, że rozwiązuje mój problem polegający na tym, że nie pozwala na wyświetlanie więcej niż dwóch cyfr po przecinku, EditText
ale problem polega getText()
na tym EditText
, że kiedy z tego zwracam cały wpis, który wpisałem.
Np. Po nałożeniu filtra na EditText
, próbowałem ustawić wejście 1.5699856987. Więc na ekranie pokazuje 1.56, co jest idealne.
Następnie chciałem użyć tych danych wejściowych do innych obliczeń, więc chciałem uzyskać tekst z tego pola wejściowego ( EditText
). Kiedy zadzwoniłem mEditText.getText().toString()
, zwraca 1,5699856987, co w moim przypadku było nie do przyjęcia.
Musiałem więc ponownie przeanalizować wartość po pobraniu jej z pliku EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
rozwiązuje problem po pobraniu pełnego tekstu z pliku EditText
.