如何在Jetpack Compose中限制TextField小数点前后的输入位数
Jetpack Compose TextField 限定NNN.NN格式数字输入实现方案
核心思路是通过输入合法性校验+数字键盘限制两层逻辑实现,不需要引入额外依赖:
- 第一层:指定键盘类型为数字键盘,从输入源减少字母、特殊符号等无效输入
- 第二层:通过正则匹配校验每次输入的内容,仅符合规则的内容才会更新到TextField状态中
完整实现代码
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.text.input.KeyboardType @Composable fun LimitedNumberTextField() { var inputValue by remember { mutableStateOf("") } // 正则规则:匹配最多3位整数,可选后跟小数点+最多2位小数 val validNumberRegex = Regex("^\\d{0,3}(\\.\\d{0,2})?$") OutlinedTextField( value = inputValue, onValueChange = { newInput -> // 可选优化:用户直接输入小数点时自动补前缀0 val processedInput = if (newInput.startsWith(".")) "0$newInput" else newInput if (processedInput.matches(validNumberRegex)) { inputValue = processedInput } // 不符合规则的输入直接丢弃,不更新状态 }, label = { Text("数字输入") }, placeholder = { Text("示例:123.45") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), singleLine = true ) }
覆盖的限制场景
- 仅允许输入0-9的数字和1个小数点,其他字符自动拦截
- 小数点前最多可输入3位数字,超出部分自动截断
- 小数点后最多可输入2位数字,超出部分自动拦截
- 不需要自动补前缀0的场景,直接删除
processedInput相关逻辑即可
内容的提问来源于stack exchange,提问作者RUGhost
相关产品推荐
相关产品推荐

