TextField 的正则表达式在 kotlin 中未按预期工作?

问题描述 投票:0回答:1

我需要在我的项目中设置某些约束,特别是在正则表达式中,以限制用户输入并对其进行适当的格式化。这些规则旨在在我的 Jetpack Compose 项目中的 TextField 组件中实现。

规则:

  • 零和点不能位于开头。
  • 只能有一个点。
  • 点后只能有两位数,点前只能有四位。
  • 如果用户不输入点,则只能输入四位数字。如果他们确实输入了一个点,则可以在其后添加两位数字。

示例:(这些示例仅供参考。)

  • 8956.32 -> 有效
  • 45 -> 有效
  • 562.2 -> 有效
  • 0655 -> 无效
  • 0356.00 -> 无效
  • .003 -> 无效

我尝试了下面的代码,但这没有按预期工作。

var text by remember { mutableStateOf("") }
val regex = remember { Regex("^(?!0|\\.)(?!.*\\.\\.)\\d{1,4}(\\.\\d{1,2})?$") }

TextField(
                label = R.string.label_days,
                value = text,
                keyboardOptions = KeyboardOptions(
                    keyboardType = KeyboardType.Number
                ),
                onValueChange = { days ->
                    if (days.isEmpty() || regex.matches(days)){
                     text = days
                    }
                })
kotlin android-jetpack-compose android-jetpack
1个回答
0
投票

下面的代码将满足您的要求

var text by remember { mutableStateOf("") }
val regex = remember { Regex("^(?!0)(?!.*\\.\\..*|\\.$)\\d{0,4}(\\.\\d{0,2})?\$") }
TextField(
    label = {
        Text(text = "Days")
    },
    value = text,
    keyboardOptions = KeyboardOptions(
        keyboardType = KeyboardType.Number
    ),
    onValueChange = { days ->
        if (days.isEmpty() || days.matches(regex)) {
            text = days
        }
    }
)

© www.soinside.com 2019 - 2024. All rights reserved.