Flutter TextFormField FilteringTextInputFormatter删除前导零



我试图实现一个输入字段的数字与3规则:

  1. 数字范围为-3000 ~ 3000,包括零
  2. 不能有/替换前导零(例如0012将转换为12)
  3. -0将被替换为0

例如:

  • 00444:失败(自动替换为444为成功)
  • 成功-2442年
  • :
  • 0:成功
  • -0:失败(自动替换为0为成功)
  • -03000:失败(自动替换为-3000为成功)

这是我目前为止实现的:

TextFormField(
keyboardType: TextInputType.numberWithOptions(signed: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp('^-?[1-9]')),
FilteringTextInputFormatter.deny(RegExp('-0'), replacementString: '0'),
FilteringTextInputFormatter.deny(RegExp('^0+')),
],
),

我已经设法将数字范围限制在-3000 ~ 3000才能工作(不在上面的代码中),通过实现RegEx,可以格式化正数和负数。同样通过使用FilteringTextInputFormatter.deny(RegExp(r'-0'), replacementString: '0'),我能够将-0替换为0。

问题是,当输入包含前导零时,上面的代码(FilteringTextInputFormatter.deny(RegExp('^0+')),)将不允许/删除前导零,但是仅将0作为输入将不起作用。

有办法达到我的目的吗?

提前感谢。

免责声明:我不是很熟悉dart/flutter,但我确实看到dart正则表达式具有与JavaScript正则表达式相同的语法和语义。因此,我想提出以下建议:

^(-(?!0+$))?-?0*([12]?d{1,3}|3000)$

$1$2代替。查看在线演示


  • ^-起始锚;
  • (-(?!0+$))?-第一个可选的捕获组,用于捕获前导连字符,如果不只是在结束行锚之前尾随零;
  • -?0*-匹配可选的连字符和0+(贪心)前导零;
  • ([12]?d{1,3}|3000)-第二个捕获组匹配范围为-3000~3000的任何数字;
  • $-尾线锚。

最新更新