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
相关产品推荐
相关产品推荐

