Регулярные выражения. Ввод только цифр 0-20 в EditText
В EditText необходимо вводить только цифры от 0-20. Приведенный код не пропускает ни одной цифры. Но исправно работает на выражениях вроде [1-3].
private static final String PATTERN ="^([1-9]|1[1-9]|20)\\d{1,2}$";
eT2.setFilters(new InputFilter[] {
new InputFilter() {
public CharSequence filter(CharSequence src, int start,int end, Spanned dst, int dstart, int dend) {
Matcher matcher=Pattern.compile(PATTERN).matcher(src);
if(!matcher.matches()) return "";
return src;
}
}
});
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Как пример
bool IsNumberAndFromZeroToTwenty(string input)
{
if (input.Length == 1) return char.IsDigit(input[0]);
if (input.Length == 2)
return ((input[0] == '0' || input[0] == '1') && char.IsDigit(input[1]))
|| (string.Compare(input, "20") == 0);
return false;
}
Проверка
var tests = new[] {"abc", "a20", "-20", "21", "4", "0", "20", "-0"};
foreach (var test in tests)
Console.WriteLine($"{test} is {IsNumberAndFromZeroToTwenty(test)}");
Результат
abc is False
a20 is False
-20 is False
21 is False
4 is True
0 is True
20 is True
-0 is False
Автор решения: 1111 2222
→ Ссылка
Реализовал через TextWatcher и метод onTextChange. В реализации через InputFilter не работает.
private static final String PATTERN ="^([0-9]|1[0-9]|2[0])$";
eT2.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Matcher matcher = Pattern.compile(PATTERN).matcher(s);
if (matcher.matches()) {
// do something
}
else {
eT2.getText().clear();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});