Kotlin验证edittext的输入和长度

时间:2018-08-19 20:27:33

标签: validation kotlin

我们有一个EditText,它是inputType numberDecimal,我们可以验证输入的数字,如果没有输入任何值。我们的问题是,如何将两者合并到一个if语句中,或者这甚至可能。直到我们尝试将此长度测试添加到值中,下面的代码运行都没有问题,并使用此代码行输入test if(F.toInt()<1 || S.toInt()> 7 || L == 0){

    fun weekDAY(view: View?){

    val L:Int = etValOne.length()
    if(L == 0){

        toast("Check The Entry\nValid Entry 1 to 7")
        return@weekDAY
    }

    val F: String = etValOne.text.toString()
    val S: String = etValOne.text.toString()

    if( F.toInt() < 1 || S.toInt() > 7 ){
        toast("Check The Entry\nValid Entry 1 to 7")
        return@weekDAY
    }

    var dayOfWeek: String = etValOne.text.toString()
    var dayOfWeekInString = when(dayOfWeek.toInt()) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        7 -> "Sunday"
        else -> "Invalid Day"
    }

    etANS.setText(dayOfWeekInString)
}

我们了解我们试图开发ERROR陷阱方法的when方法中的else语句。是的,我们已经查看了其他帖子,它们是我们能够编写两次错误检查的方式。没有帖子同时检查了这两个值!

2 个答案:

答案 0 :(得分:2)

在您的函数中,您有重复的不必要的编码。
我尝试简化一下:

fun weekDAY(view: View?){
    val F: String = etValOne.text.toString().trim()
    val L: Int = F.length
    var value = 0
    try {
        value = F.toInt()
    } catch (e: NumberFormatException) {
    }

    if((L == 0) || (value !in 1..7)) {
        toast("Check The Entry\nValid Entry 1 to 7")
        return@weekDAY
    }

    val dayOfWeekInString = when(value) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        7 -> "Sunday"
        else -> "Invalid Day"
    }

    etANS.setText(dayOfWeekInString)
}

如您所见,您只需一次从EditText etValOne中获取字符串:F
然后您就可以获取其长度:L
那么您会得到一个数值:value被try / catch包围,因此,如果字符串为空或非数字,则应用程序不会崩溃。
之后,只有1个if会同时检查长度和值。
else语句的when部分将永远不会执行。
如果要在无效值的情况下将字符串"Invalid Day"显示在EditText etANS中,则必须在if块内进行编码。
上面的代码甚至可以简化甚至更多(但我保留了您原来的逻辑),如下所示:

fun weekDAY(view: View?){
    val F: String = etValOne.text.toString().trim()
    var value = 0
    try {
        value = F.toInt()
    } catch (e: NumberFormatException) {
    }

    val dayOfWeekInString = when(value) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        7 -> "Sunday"
        else -> {
            toast("Check The Entry\nValid Entry 1 to 7")        
            "Invalid Day"
        }
    }
    etANS.setText(dayOfWeekInString)
}

这样您不需要显式检查长度,因为如果长度为0,则NumberFormatException语句和变量{{ 1}}将保持为0。因此稍后的catch语句将返回value

答案 1 :(得分:0)

尽管以上答案是正确的,但我想补充一点。不应在方法主体内部设置editText的值,而应返回有效日期或错误。 Function将以这种方式执行其独立任务,并且是可测试的。

fun weekDAY(view: View?) : String{
    val F: String = etValOne.text.toString().trim()
    var value = 0
    try {
        value = F.toInt()
    } catch (e: NumberFormatException) {
    }

    return when(value) {
        1 -> "Monday"
        2 -> "Tuesday"
        3 -> "Wednesday"
        4 -> "Thursday"
        5 -> "Friday"
        6 -> "Saturday"
        7 -> "Sunday"
        else -> {
            toast("Check The Entry\nValid Entry 1 to 7")
            "Invalid Day"
        }
    }
}