12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import 'package:flutter/services.dart';
- class XNumberTextInputFormatter extends TextInputFormatter {
- int? maxIntegerLength;
- int? maxDecimalLength;
- bool isAllowDecimal;
- /// [maxIntegerLength]限定整数的最大位数,为null时不限
- /// [maxDecimalLength]限定小数点的最大位数,为null时不限
- /// [isAllowDecimal]是否可以为小数,默认是可以为小数,也就是可以输入小数点
- XNumberTextInputFormatter({
- this.maxIntegerLength,
- this.maxDecimalLength,
- this.isAllowDecimal = true,
- });
- @override
- TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
- String value = newValue.text.trim(); //去掉前后空格
- int selectionIndex = newValue.selection.end;
- if (isAllowDecimal) {
- if (value == '.') {
- value = '0.';
- selectionIndex++;
- } else if (value != '' && _isToDoubleError(value)) {
- //不是double输入数据
- return _oldTextEditingValue(oldValue);
- }
- //包含小数点
- if (value.contains('.')) {
- int pointIndex = value.indexOf('.');
- String beforePoint = value.substring(0, pointIndex);
- // print('$beforePoint');
- String afterPoint = value.substring(pointIndex + 1, value.length);
- // print('$afterPoint');
- //小数点前面没内容补0
- if (beforePoint.isEmpty) {
- value = '0.$afterPoint';
- selectionIndex++;
- } else {
- //限定整数位数
- if (maxIntegerLength != null) {
- if (beforePoint.length > maxIntegerLength!) {
- return _oldTextEditingValue(oldValue);
- }
- }
- }
- //限定小数点位数
- if (null != maxDecimalLength) {
- if (afterPoint.length > maxDecimalLength!) {
- return _oldTextEditingValue(oldValue);
- }
- }
- } else {
- //限定整数位数
- if (null != maxIntegerLength) {
- if (value.length > maxIntegerLength!) {
- return _oldTextEditingValue(oldValue);
- }
- }
- }
- } else {
- if (value.contains('.') ||
- (value != '' && _isToDoubleError(value)) ||
- (null != maxIntegerLength && value.length > maxIntegerLength!)) {
- return _oldTextEditingValue(oldValue);
- }
- }
- return TextEditingValue(
- text: value,
- selection: TextSelection.collapsed(offset: selectionIndex),
- );
- }
- ///返回旧的输入内容
- TextEditingValue _oldTextEditingValue(TextEditingValue oldValue) {
- return TextEditingValue(
- text: oldValue.text,
- selection: TextSelection.collapsed(offset: oldValue.selection.end),
- );
- }
- ///输入内容不能解析成double
- bool _isToDoubleError(String value) {
- try {
- double.parse(value);
- } catch (e) {
- return true;
- }
- return false;
- }
- }
|