涉及金錢使用:
只能錄入數(shù)字,并且錄入的數(shù)字最多保留二位小數(shù)。不會以0
開頭,自動轉(zhuǎn)為0.
。
小數(shù)點只能輸入一個且之后只能輸入兩位數(shù)字
不能輸入除.
和數(shù)字
外的其他字符
使用:
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) {
// //第一個不能輸入小數(shù)點
// return oldValue;
// }
///輸入完全刪除
if (newValue.text.isEmpty) {
return TextEditingValue();
}
///只允許輸入小數(shù)
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;
}
///包含小數(shù)點的情況
if (newValue.text.contains(POINTER)) {
///包含多個小數(shù)
if (newValue.text.indexOf(POINTER) != newValue.text.lastIndexOf(POINTER)) {
return oldValue;
}
String input = newValue.text;
int index = input.indexOf(POINTER);
///小數(shù)點后位數(shù)
int lengthAfterPointer = input.substring(index, input.length).length - 1;
///小數(shù)位大于精度
if (lengthAfterPointer > _scale) {
return oldValue;
}
} else if (newValue.text.startsWith(POINTER) || newValue.text.startsWith(DOUBLE_ZERO)) {
///不包含小數(shù)點,不能以“00”開頭
return oldValue;
}
return newValue;
}
}