Flutter TextFormField输入格式化问题:移除前导零且支持单独输入0
问题描述
需要实现一个数字输入框,满足以下规则:
- 输入数字范围为 -3000~3000(包含0);
- 移除前导零(如
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+')), ], ),
当前代码已完成数字范围限制(未在上述代码中体现),实现了正负数字格式化和-0转0,但存在问题:移除前导零的规则导致无法输入单独的0。
解决方案
通过调整FilteringTextInputFormatter的正则逻辑,即可覆盖所有规则并解决无法输入0的问题,以下是优化后的实现:
优化后的代码
TextFormField( keyboardType: TextInputType.numberWithOptions(signed: true), inputFormatters: [ // 允许合法输入:单独的0/-0、非零开头的正负数字 FilteringTextInputFormatter.allow(RegExp(r'^-?0$|^-?[1-9]\d*$')), // 移除前导零:保留负号(如果有),去掉开头连续的零(后面需跟数字) FilteringTextInputFormatter.deny(RegExp(r'^(-?)0+(?=\d)'), replacementString: r'$1'), // 将-0替换为0 FilteringTextInputFormatter.deny(RegExp(r'^-0$'), replacementString: '0'), // 加入你已实现的数字范围限制Formatter // YourRangeLimitingFormatter(), ], ),
代码逻辑说明
合法输入校验:正则
^-?0$|^-?[1-9]\d*$明确允许两种输入:- 单独的
0或-0; - 以负号开头/不以负号开头的、非零起始的数字序列,从源头避免无效的前导零输入。
- 单独的
前导零移除:正则
^(-?)0+(?=\d)捕获开头的负号(如果存在),匹配后面紧跟数字的连续前导零,替换后保留负号、去掉多余的零,比如0012转为12,-03000转为-3000。-0转0:直接匹配完整的
-0字符串,替换为0,确保最终输入不会出现-0。
补充说明
如果你的数字范围限制是自定义的TextInputFormatter,直接将其加入inputFormatters列表即可,建议放在最后执行,确保先完成格式处理再做范围校验。
内容的提问来源于stack exchange,提问作者Jaebi
相关产品推荐
相关产品推荐

