Flutter - 在TextFormField中使用正则表达式

9

我希望将文本表单字段限制为只允许输入数字和小数点。

我有类似这样的代码:

WhitelistingTextInputFormatter(RegExp("\d*[.]\d*"))

但是不起作用,那么:有人有想法如何只允许数字和点号吗?

1个回答

21
自Flutter 1.20起,WhitelistingTextInputFormatter已被弃用,可以使用FilteringTextInputFormatter

一个TextInputFormatter,它防止插入与特定模式匹配(或不匹配)的字符。

在新的TextEditingValue中发现的过滤字符实例将被替换为replacementString(默认为空字符串)。

由于此格式化程序仅从文本中删除字符,因此它尝试保留现有TextEditingValue.selection到值,以便其偏移的位置与已删除的字符相同。

示例用法:

TextField(
 keyboardType: TextInputType.numberWithOptions(decimal: true),
 inputFormatters: <TextInputFormatter>[
      FilteringTextInputFormatter.allow(RegExp(r'^\d+(?:\.\d+)?$')),
  ], 
),

已有的回答

WhitelistingTextInputFormatter "创建了一个只允许插入白名单字符模式的格式化程序"。这意味着您的模式应该仅匹配任何1位数字或1个点。

此外,如果您要使用正则表达式转义和单个反斜杠,请使用原始字符串文字。

使用

WhitelistingTextInputFormatter(RegExp(r"[\d.]"))

请注意,如果您想验证整个输入序列,您需要定义一个validator: validateMyInput,然后添加。

String validateMyInput(String value) {
    Pattern pattern = r'^\d+(?:\.\d+)?$';
    RegExp regex = new RegExp(pattern);
    if (!regex.hasMatch(value))
      return 'Enter Valid Number';
    else
      return null;
  }

修改自Flutter中的表单验证.


WhitelistingTextInputFormatter 已被弃用,您应该使用 FilteringTextInputFormatter(FilteringTextInputFormatter.allow 用于 WhitelistingTextInputFormatter 替换) - Elias Teeny
1
答案似乎不正确:“FilteringTextInputFormatter.allow”仅接受单个字符的正则表达式,而不是整个输入的表达式,例如“^\d+(?:.\d+)?$”。 - porton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接