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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:06:08