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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:07