You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:31:02