涉及金钱使用:
只能录入数字,并且录入的数字最多保留二位小数。不会以0
开头,自动转为0.
。
小数点只能输入一个且之后只能输入两位数字
不能输入除.
和数字
外的其他字符
使用:
TextField(
...
controller: myController
keyboardType: TextInputType.numberWithOptions(decimal: true),//由于某些机型键盘并不能做到强制故再条件上加上FilteringTextInputFormatter.allow(RegExp('[0-9.,]+')
inputFormatters: [
PrecisionLimitFormatter(2),
FilteringTextInputFormatter.allow(RegExp('[0-9.,]+'))
],
)
轮子:
import 'package:flutter/services.dart';
import 'dart:math' as math;
class PrecisionLimitFormatter extends TextInputFormatter {
int _scale;
PrecisionLimitFormatter(this._scale);
RegExp exp = RegExp(r"[0-9]");
static const String POINTER = ".";
static const String DOUBLE_ZERO = "00";
static const String ZERO = "0";
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
print('oldValue:'+oldValue.text);
print('newValue:'+newValue.text);
if(newValue.text.startsWith('.')){
return TextEditingValue(text: '0.',selection:TextSelection.collapsed(offset: 2));
}
// if (newValue.text.startsWith(POINTER) && newValue.text.length == 1) {
// //第一个不能输入小数点
// return oldValue;
// }
///输入完全删除
if (newValue.text.isEmpty) {
return TextEditingValue();
}
///只允许输入小数
if (!exp.hasMatch(newValue.text)) {
return oldValue;
}
if(newValue.text.startsWith(ZERO) && newValue.text.split("0")[1].startsWith(RegExp(r'[0-9]'))){
return TextEditingValue(text: '0',selection:TextSelection.collapsed(offset: 1));
// return newValue;
}
///包含小数点的情况
if (newValue.text.contains(POINTER)) {
///包含多个小数
if (newValue.text.indexOf(POINTER) != newValue.text.lastIndexOf(POINTER)) {
return oldValue;
}
String input = newValue.text;
int index = input.indexOf(POINTER);
///小数点后位数
int lengthAfterPointer = input.substring(index, input.length).length - 1;
///小数位大于精度
if (lengthAfterPointer > _scale) {
return oldValue;
}
} else if (newValue.text.startsWith(POINTER) || newValue.text.startsWith(DOUBLE_ZERO)) {
///不包含小数点,不能以“00”开头
return oldValue;
}
return newValue;
}
}