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位
2、只取整数5楼
3、限制00,01,02,03,04等非法输入