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

EditText日期格式化器无法删除首个斜杠,删除操作UI异常

问题原因

你的日期格式化逻辑存在关键问题:当输入的纯数字长度在2到3位之间时,会强制添加第一个斜杠。

具体细节:

  • 当用户删除第一个斜杠后,输入会变成无斜杠的2-3位数字(比如234),此时cleanInput就是这个纯数字串,长度符合textLength >=2 && textLength <4的条件,格式化逻辑会自动重新拼接成带斜杠的形式(23/4),用户的删除操作被覆盖,看起来删不掉第一个斜杠。
  • 而第二个斜杠只有在纯数字长度≥5时才会添加,当用户删除第二个斜杠后,纯数字长度回到4位及以下,不满足textLength >=5的条件,不会被强制添加回去,因此可以正常删除。
修复方案

修改格式化逻辑,不再强制给2-3位的纯数字添加斜杠,仅在用户输入第3个数字时自动添加第一个斜杠,同时允许用户删除斜杠后保留纯数字状态,直到下一次输入。

调整后的代码如下:

internal class DateFormatter {

    override fun format(input: String): String {
        // 过滤掉非数字和非斜杠的无效字符
        val filteredInput = input.filter { it.isDigit() || it == '/' }
        val cleanDigits = filteredInput.replace("/", "")
        val digitLength = cleanDigits.length

        // 处理末尾斜杠的异常情况
        if (filteredInput.endsWith("/")) {
            return filteredInput.dropLast(1)
        }

        // 仅在输入数字触发阈值时自动添加斜杠,其余情况保留用户输入状态
        return when {
            // 输入第3个数字时,自动添加第一个斜杠
            digitLength == 3 -> "${cleanDigits.substring(0,2)}/${cleanDigits.substring(2)}"
            // 输入第5个及以上数字时,自动添加两个斜杠
            digitLength >=5 -> "${cleanDigits.substring(0,2)}/${cleanDigits.substring(2,4)}/${cleanDigits.substring(4)}".take(10)
            // 其他情况返回过滤后的输入,同时去重连续斜杠
            else -> filteredInput.replace(Regex("/+"), "/")
        }
    }
}
逻辑说明
  1. 非法字符过滤:只保留数字和斜杠,避免无效输入干扰格式。
  2. 末尾斜杠处理:自动移除用户输入末尾的斜杠,避免格式异常。
  3. 智能添加斜杠:仅在输入第3个、第5个数字时自动补全斜杠,其余情况尊重用户的输入状态(比如删除斜杠后的纯数字串)。
  4. 斜杠去重:用正则替换连续多个斜杠为单个,避免格式混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:30:59