我试图实现一个输入字段的数字与3规则:
- 数字范围为-3000 ~ 3000,包括零
- 不能有/替换前导零(例如0012将转换为12)
- -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的任何数字;$
-尾线锚。