小数的正则表达式在 flutter TextFormField inputFormatters 中不起作用

Dha*_*ara 1 regex regex-group dart flutter

正则表达式的要求:

  • 号码的最大长度为 12 个字符
  • 如果数字中有小数点,则用户最多可以在小数点后添加 4 位数字,最少添加 1 位数字。
  • 有效输入: - 222244445555、22223333.3333、5555.33、1.2、0.33、11112222333.3
  • 无效输入:22.、.11、2222333344443、444445555544.、333344445.1234

我尝试在RegExr上生成相同的正则表达式,它满足了我的要求,但是当我将相同的内容应用于颤动表单 TextFormField 时,它不起作用。

正则表达式: ^[[0-9]{0,8}(\.[0-9]{1,4})?$|^[[0-9]{0,9}(\.[0-9]{1,3})?$|^[[0-9]{0,10}(\.[0-9]{1,2})?$|^[[0-9]{0,11}(\.[0-9]{1})?$|^[0-9]{0,12}

颤振文本字段代码:

TextFormField(
   controller: _textEditingController,
   keyboardType:TextInputType.numberWithOptions(decimal: true),
   inputFormatters: <TextInputFormatter>[
          WhitelistingTextInputFormatter(RegExp(r'^[[0-9]{0,8}(\.[0-9]{1,4})?$|^[[0-9]{0,9}(\.[0-9]{1,3})?$|^[[0-9]{0,10}(\.[0-9]{1,2})?$|^[[0-9]{0,11}(\.[0-9]{1})?$|^[0-9]{0,12}')),
   ],
),
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我无法dot(.)在 TextFormField 中输入。

注意:用户不应在 中输入多于一位小数的数字TextFormField

Wik*_*żew 5

请注意,如果您想验证整个输入序列,您需要定义 avalidator: validateMyInput然后实现该函数:

String validateMyInput(String value) {
    RegExp regex = new RegExp(r'^(?=\D*(?:\d\D*){1,12}$)\d+(?:\.\d{1,4})?$');
    if (!regex.hasMatch(value))
      return 'Enter Valid Number';
    else
      return null;
  }
Run Code Online (Sandbox Code Playgroud)

更多详细信息请参阅Flutter 中的表单验证

正则表达式是

^(?=\D*(?:\d\D*){1,12}$)\d+(?:\.\d{1,4})?$
Run Code Online (Sandbox Code Playgroud)

请参阅其演示细节

  • ^- 字符串的开头
  • (?=\D*(?:\d\D*){1,12}$)- 字符串中需要 1 到 12 位数字
  • \d+- 1 位或多位数字
  • (?:\.\d{1,4})?.- 由 a和 1、2、3 或 4 位数字组成的可选序列
  • $- 字符串末尾。