欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flutter TextField中数字的精确限定

程序员文章站 2022-05-28 18:52:35
...

主要是新建一个文本格式类,继承TextInputFormatter,在内部进行精确控制
实现整数位及小数位的长度控制,小数位为零即限定整数长度,限制以点开头及00,01,02这种非法输入

上代码

import 'package:flutter/services.dart';
///数字输入的精确控制
class TextNumberLimitFormatter extends TextInputFormatter {
  int _declen;
  int _intlen;

  TextNumberLimitFormatter(this._intlen,this._declen);

  RegExp exp = new RegExp("[0-9.]");
  static const String POINTER = ".";
  static const String ZERO = "0";

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    ///输入完全删除
    if (newValue.text.isEmpty) {
      return TextEditingValue();
    }

    //只允许输入数字和小数点
    if (!exp.hasMatch(newValue.text)) {
      return oldValue;
    }

    ///包含小数点的情况
    if (newValue.text.contains(POINTER)) {
      //精度为0,即不含小数
      if(_declen==0)
        return oldValue;

      ///包含多个小数
      if (newValue.text.indexOf(POINTER) !=
          newValue.text.lastIndexOf(POINTER)) {
        return oldValue;
      }
      String input = newValue.text;
      int index = input.indexOf(POINTER);

      ///小数点前位数
      int lengthBeforePointer = input.substring(0, index).length;

      ///整数部分大于约定长度
      if (lengthBeforePointer > _intlen) {
        return oldValue;
      }
      ///小数点后位数
      int lengthAfterPointer = input.substring(index, input.length).length - 1;
      print('小数后位数'+lengthAfterPointer.toString());
      ///小数位大于精度
      if (lengthAfterPointer > _declen) {
        return oldValue;
      }

    } else if (
        //以点开头
        newValue.text.startsWith(POINTER) 
        ||
        //如果第1位为0,并且长度大于1,排除00,01-09所有非法输入
        (newValue.text.startsWith(ZERO) && newValue.text.length>1)
        ||
        //如果整数长度超过约定长度
        newValue.text.length>_intlen
        ) {
      return oldValue;
    }
    return newValue;
  }
}

//使用:
child:TextField(
 keyboardType: TextInputType.number,
 maxLines: 1,
 textAlign: TextAlign.right,
 focusNode: priceFocus,
 inputFormatters: [TextNumberLimitFormatter(5,3),],	//整数5位,小数3楼
 inputFormatters: [TextNumberLimitFormatter(5,0)],	//只整数5位

看效果

1、整数5位,小数3位
Flutter TextField中数字的精确限定
2、只取整数5楼
Flutter TextField中数字的精确限定
3、限制00,01,02,03,04等非法输入
Flutter TextField中数字的精确限定

相关标签: Flutter