Android edittext - не разрешать только десятичный разделитель - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть Edittext, где я хочу разрешить только цифры и десятичные числа (максимум 2 десятичных знака после разделителя, например, 125.50).

Я применил фильтр для этого:

 final EditText  field1 = (EditText)findViewById(R.id.field1);
 field1.setFilters(new InputFilter[] { filter });

    InputFilter filter = new InputFilter() {
        final int maxDigitsBeforeDecimalPoint=5;
        final int maxDigitsAfterDecimalPoint=2;

        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                                   Spanned dest, int dstart, int dend) {
            StringBuilder builder = new StringBuilder(dest);
            builder.replace(dstart, dend, source
                    .subSequence(start, end).toString());
            if (!builder.toString().matches(
                    "(([0-9]{1})([0-9]{0,"+(maxDigitsBeforeDecimalPoint-1)+"})?)?(\\.[0-9]{0,"+maxDigitsAfterDecimalPoint+"})?"

            )) {
                if(source.length()==0)
                    return dest.subSequence(dstart, dend);
                return "";
            }

            return null;

        }
    };

Это нормально работает , но проблема в том, что если пользователь вставляет десятичный разделитель ALONE, у меня есть java.lang.NumberFormatException: для входной строки: "."

В моем ontextChanged Я попробовал это:

 if(field1.getText().toString().equals("[.]")){field1.setText(0);}

также это

if(field1.getText().toString().equals(".")){field1.setText(0);}

, но не сработало.

Как я могу ограничить только десятичный разделитель,но разрешить это с цифрами?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Для ссылок, вы можете использовать эту ссылку, если вы хотите использовать InputFilter: https://stackoverflow.com/a/5368816/10396176

Для других ссылок, если вы хотите использовать хотите попробовать использовать textWatcher: https://stackoverflow.com/a/16684661/10396176

0 голосов
/ 21 ноября 2018

Если это:

if(field1.getText().toString().equals(".")){field1.setText(0);}

- ваш точный код, то он наверняка не удался, потому что 0 не строка, это целое число, которое считается идентификатором ресурса.Итак, сначала попробуйте это:

if(field1.getText().toString().equals(".")){field1.setText("0");}

Если снова произойдет сбой, то подумайте, что NumberFormatException может быть разрешено с помощью try/catch следующим образом:

double value = 0.0;
try {
    value = Double.parseDouble(field1.getText().toString());
} catch (NumberFormatException e) {
    field1.setText("0");
    e.printStackTrace();
}
...