Flutter TextFormField适配.开头浮点数输入的实现方法
问题根源
现有校验逻辑直接对输入过程中的实时文本执行double.parse:用户输入.5时,会先输入单个.,此时文本内容为.,double.parse(".")直接抛出格式异常,输入被拦截,无法继续输入后续数字。此外原有过滤正则未限制小数点数量,允许输入1.2.3这类多小数点的非法格式,存在逻辑漏洞。
修复方案
调整两处逻辑即可兼容.5类省略整数位0的输入场景:
- 收紧输入过滤正则,仅允许数字和最多1个小数点,从源头禁止多小数点的非法输入
- 优化解析前的文本预处理逻辑,兼容输入过程中的中间态,以及开头为小数点的合法小数格式
修正后完整代码如下:
inputFormatters: [ // 正则限制:仅允许数字、最多1个小数点,拦截多小数点、非数字字符输入 FilteringTextInputFormatter.allow(RegExp(r'^\d*\.?\d*$')), TextInputFormatter.withFunction((oldValue, newValue) { final inputText = newValue.text; // 空文本属于正常删除场景,直接放行 if (inputText.isEmpty) return newValue; // 单个小数点为输入过程中间态,放行允许后续输入数字 if (inputText == '.') return newValue; try { // 开头为小数点的输入自动补前缀0后做格式校验,兼容.xxx类小数 final parseTarget = inputText.startsWith('.') ? '0$inputText' : inputText; double.parse(parseTarget); return newValue; } catch (e) { // 格式非法则回退到旧输入值 return oldValue; } }), ],
适配效果
- 支持直接输入
.5这类省略整数位0的小数,后续通过double.parse取值时可正常识别为0.5,不影响业务逻辑 - 禁止输入多个小数点、特殊字符、字母等非法内容
- 兼容输入过程中的临时状态,不会出现输入中途被拦截无法继续输入的问题
- 同时支持整数、
0.xxx、xxx.xxx等所有标准数值格式输入
内容的提问来源于stack exchange,提问作者Abdus Sattar Bhuiyan
相关产品推荐
相关产品推荐

