Flutter TextField:如何创建双精度数验证正则表达式及配置FilteringTextInputFormatter
Flutter TextField 双精度数输入限制与验证方案
1. 核心规则对应的正则设计
针对需求中的输入限制,我们需要两套正则:一套用于实时输入过滤(允许输入过程中的中间状态,比如单独的"-"、"0."),另一套用于最终有效性验证(确保输入是合法的双精度数)。
实时输入过滤正则
用于拦截输入过程中的非法字符和格式:
^-?((0(\.\d*)?)|([1-9]\d*(\.\d*)?))?$
规则拆解:
^-?:允许可选的负号开头(0(\.\d*)?):0开头时,仅允许后续输入小数点(可带任意数字,包括空),禁止输入其他数字([1-9]\d*(\.\d*)?):非零开头时,可输入任意数字,后续可选带一个小数点和任意数字?$:允许空输入,适配输入初始状态
最终有效性验证正则
用于提交时确认输入是合法的双精度数:
^-?((0\.\d+)|([1-9]\d*(\.\d+)?))$
规则补充:
- 要求小数点后必须至少有一位数字(避免"0."或"123."这类不完整格式)
- 若允许单独输入"0",可调整为
^-?((0(\.\d+)?)|([1-9]\d*(\.\d+)?))$
2. 用FilteringTextInputFormatter实现实时限制
通过FilteringTextInputFormatter.allow配合实时正则,直接拦截非法输入:
final doubleInputFilter = FilteringTextInputFormatter.allow( RegExp(r'^-?((0(\.\d*)?)|([1-9]\d*(\.\d*)?))?$'), );
额外可添加逗号过滤的兜底规则(双重保障):
final denyCommaFilter = FilteringTextInputFormatter.deny(RegExp(r','));
3. 完整TextField示例
将过滤规则和验证逻辑整合到实际组件中:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class DoubleInputField extends StatefulWidget { const DoubleInputField({super.key}); @override State<DoubleInputField> createState() => _DoubleInputFieldState(); } class _DoubleInputFieldState extends State<DoubleInputField> { bool _isInvalid = false; final _doubleRegex = RegExp(r'^-?((0\.\d+)|([1-9]\d*(\.\d+)?))$'); @override Widget build(BuildContext context) { return TextField( decoration: InputDecoration( labelText: '双精度数输入', errorText: _isInvalid ? '请输入有效的双精度数' : null, border: const OutlineInputBorder(), ), keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ FilteringTextInputFormatter.allow( RegExp(r'^-?((0(\.\d*)?)|([1-9]\d*(\.\d*)?))?$'), ), FilteringTextInputFormatter.deny(RegExp(r',')), ], onChanged: (value) { setState(() { // 空输入不标记错误,可根据需求调整 _isInvalid = value.isNotEmpty && !_doubleRegex.hasMatch(value); }); }, ); } }
规则生效说明
- 禁止多个小数点:正则中每个数字段仅允许最多一个小数点,输入第二个小数点时无法匹配规则,会被直接拦截
- 禁止输入逗号:通过
deny规则直接过滤逗号,同时正则也未包含逗号,双重拦截 - 零后仅允许输入小数点:0开头的分支仅允许后续接小数点(及数字),输入0后再输其他数字会形成"01"这类不匹配规则的格式,被拦截
内容的提问来源于stack exchange,提问作者user16308846
相关产品推荐
相关产品推荐

