Проверка ввода числа Kotlin

Есть поле EditText в inputType выбрал numberDecimal.

Теперь возник вопрос проверки данных которые введёт пользователь. На пустое поле нашёл как проверять.

Осталось сделать проверку на то что пользователь введёт любые символы кроме цифр и точки, так же нужно сделать проверку на то что точка и ноль не может быть первыми символом. И проверку на то что после точки может быть только два знака.

Помогите пожалуйста а то в котлине и в андроид студио буквально пару дней) Заранее всем спасибо ;)


Ответы (3 шт):

Автор решения: Эникейщик

Тип numberDecimal потому так и называется, что принимает только цифры, знак минус и десятичный разделитель. Ничего дополнительно проверять не надо

→ Ссылка
Автор решения: Andrew

Чтобы проверить что введенные данные не начинаются с 0 или точки можно добавить в активность/фрагмент слушатель ввода и там проверять:

editTextSample.addTextChangedListener(object : TextWatcher {
 
    override fun afterTextChanged(s: Editable) {}
 
    override fun beforeTextChanged(s: CharSequence, start: Int,
                                   count: Int, after: Int) {
    }
 
    override fun onTextChanged(s: CharSequence, start: Int,
                               before: Int, count: Int) {
    }
})

к примеру в этом методе onTextChanged вы будете проверять то что вводит пользователь сразу как он это ввел:

override fun onTextChanged(s: CharSequence, start: Int,
                                   before: Int, count: Int) {

    val text = s.toString().trim().get(0) // first letter


}

и дальше уже проверяйте на ваши условия

→ Ссылка
Автор решения: Vlad Orlinskas

Это не изящное решение, но оно будет работать.

У вас есть два варианта, проверять поле ввода, после нажатия какой-то кнопки или же сразу (как ниже). Но тогда вам нужна некая задержка, чтобы пользователь успел ввести то, что задумал. Для этого отлично подходит Handler с задержкой в одну секунду, так пользователь поймет ошибку. Если ответ покажется вам полезным, могу его расширить.

Если правила проверки не такие, как вам нужно, опишите это в комментарии

editTextSample.addTextChangedListener(object : TextWatcher {
 
    override fun afterTextChanged(s: Editable) {}
 
    override fun beforeTextChanged(s: CharSequence, start: Int,
                                   count: Int, after: Int) {
    }
 
    override fun onTextChanged(s: CharSequence, start: Int,
                               before: Int, count: Int) {
       if (isValid(s.toString)) {
          // done
       } else {
          editTextSample.error = "your error text"
       }
    }
})

    fun isValid(text: String): Boolean {
        val firstLetter = text.firstOrNull()

        if (firstLetter == null || firstLetter == '0' || firstLetter == '.') {
            return false
        }

        if (!text.contains('.')) {
            return false
        }

        if (text.substringAfter('.').count() != 2) {
            return false
        }
        
        text.toDoubleOrNull() ?: return false

        return true
    }
→ Ссылка