You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Android计算器输入逻辑异常:if语句未按预期工作求助

计算器输入逻辑问题排查与修复

问题说明

有通用编程基础,刚接触Kotlin和Android开发,开发简易计算器时遇到输入逻辑异常:

  • 空输入状态判断正常
  • 输入第二个数字或符号后,后续所有操作都会进入「以符号结尾添加数字」分支
  • 无法正确判断输入框内容的结尾类型,也没实现禁止连续输入符号的功能

核心原因

代码中错误使用了Regex.matches()方法:

  • matches()要求整个字符串完全匹配正则表达式,而非仅判断结尾是否符合
  • 你定义的numbers = Regex("[0-9]$"),只有当输入框内容是单个数字时(比如"3"),matches()才会返回true
  • 一旦输入框内容长度超过1(比如"34"或"3+"),matches()直接返回false,导致后续逻辑错误进入符号结尾的分支

修复后的代码

改用直接判断字符串最后一个字符的方式,逻辑更清晰且准确:

fun addToDisplay(toAdd: String, display: TextView) {
    val validSymbols = setOf('-', '.', '/', '+', '*')
    val currentText = display.text.toString()

    if (currentText.isEmpty()) {
        // 空输入时,不允许直接输入符号
        if (!validSymbols.contains(toAdd.first())) {
            display.append(toAdd)
            println("Empty display")
        }
    } else {
        val lastChar = currentText.last()
        if (lastChar.isDigit()) {
            // 结尾是数字:可以追加数字或符号
            display.append(toAdd)
            println("Ends in number: $currentText -> ${currentText + toAdd}")
        } else {
            // 结尾是符号:只能追加数字,避免连续输入符号
            if (toAdd.first().isDigit()) {
                display.append(toAdd)
                println("Ends in symbol, adding number: $currentText -> ${currentText + toAdd}")
            }
        }
    }
}

修复逻辑说明

  1. 用validSymbols集合存储允许的运算符,比正则更直观
  2. 空输入时,判断输入内容的第一个字符是否为符号,避免直接输入符号
  3. 非空输入时,取输入框内容的最后一个字符:
    • 若为数字:允许追加数字或符号
    • 若为符号:仅允许追加数字,自动拦截连续输入符号的操作

内容的提问来源于stack exchange,提问作者FatalErrorDriveB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:48:21