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

Jetpack Compose中TextField特定数字格式的Regex验证问题

解决Jetpack Compose TextField的正则验证问题

问题根源

你当前使用的正则(^[0-9]{1})[.]([0-9]{2})?(9)?强制要求输入必须包含小数点,导致用户输入第一个数字(比如"1")时就不匹配正则,无法更新输入框内容,自然无法完成后续输入步骤。

解决方案

需要编写一个覆盖所有合法输入阶段的正则,允许用户按「数字→小数点→数字→数字→9」的步骤逐步输入,同时拦截不符合规则的内容:

val validRegex = remember { Regex("^[0-9]$|^[0-9]\\.$|^[0-9]\\.[0-9]$|^[0-9]\\.[0-9]{2}$|^[0-9]\\.[0-9]{2}9$") }

这个正则会匹配以下所有合法状态:

  • 空字符串(允许清空输入)
  • 单个数字(如"1")
  • 数字+小数点(如"1.")
  • 数字+小数点+1位小数(如"1.3")
  • 数字+小数点+2位小数(如"1.35")
  • 最终合法格式:数字+小数点+2位小数+9(如"1.359")

完整代码示例

OutlinedTextField(
    modifier = Modifier.width(180.dp),
    value = price,
    onValueChange = { newText ->
        // 限制最大长度为5(最终格式的字符数),同时校验正则
        if (newText.isEmpty() || (newText.length <= 5 && newText.matches(validRegex))) {
            priceChanged(newText)
        }
    },
    label = { Text("请输入指定格式内容") },
    // 可选:添加错误提示(当输入满5位但不符合最终格式时)
    isError = price.isNotEmpty() && price.length == 5 && !price.matches(Regex("^[0-9]\\.[0-9]{2}9$"))
)

验证效果

  • 合法输入:"1"→"1."→"1.3"→"1.35"→"1.359" 均可正常输入
  • 非法输入:"19"(无小数点)、"1.355"(末尾非9)、"1.3599"(长度超限)、"1."之后输入非数字等情况都会被拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:15:11