如何解决inputFormatter应该只允许十进制数和负数
我想允许用户仅添加数字“ 12345”和十进制数字(例如“ 21321.12312”)和负数(例如-23423.32432)。用户不应添加多个“。”例如“ 12..32”,并在输入的开头添加“-”,例如-324.34,而不是324-4323。
我使用了此regEx r'^(-?\d+\.\d+)(\s*,\s*-?\d+\.\d+)+$'
,但无法输入任何内容。
TextField代码:
TextFormField(
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp(r'^(-?\d+\.\d+)(\s*,\s*-?\d+\.\d+)+$')),],controller: budget,keyboardType: TextInputType.number,decoration: Inputdecoration(
contentPadding:
EdgeInsets.only(right: 20,left: 20,top: 10,bottom: 10),hintText: getTranslated(context,"budget_example"),hintStyle: TextStyle(fontSize: 13,fontFamily: "tahoma"),border: OutlineInputBorder(
borderSide: BorderSide(width: 1,color: MyColors.secondary),borderRadius: BorderRadius.circular(100),),
解决方法
仅允许1个。
允许否定
在开始处加上负号
我们应该创建自己的输入格式器
import 'package:flutter/services.dart';
class NumberTextInputFormatter extends TextInputFormatter {
NumberTextInputFormatter({this.decimalRange}) : assert(decimalRange == null || decimalRange > 0);
final int decimalRange;
@override
TextEditingValue formatEditUpdate(TextEditingValue oldValue,TextEditingValue newValue) {
TextEditingValue _newValue = this.sanitize(newValue);
String text = _newValue.text;
if (decimalRange == null) {
return _newValue;
}
if (text == '.') {
return TextEditingValue(
text: '0.',selection: _newValue.selection.copyWith(baseOffset: 2,extentOffset: 2),composing: TextRange.empty,);
}
return this.isValid(text) ? _newValue : oldValue;
}
bool isValid(String text) {
int dots = '.'.allMatches(text).length;
if (dots == 0) {
return true;
}
if (dots > 1) {
return false;
}
return text.substring(text.indexOf('.') + 1).length <= decimalRange;
}
TextEditingValue sanitize(TextEditingValue value) {
if (false == value.text.contains('-')) {
return value;
}
String text = '-' + value.text.replaceAll('-','');
return TextEditingValue(text: text,selection: value.selection,composing: TextRange.empty);
}
}
和(不要忘记导入上一个类)
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NumberFormField extends StatelessWidget {
final InputDecoration decoration;
final TextEditingController controller;
final int decimalRange;
const NumberFormField({Key key,this.decoration,this.controller,this.decimalRange}) :super(key: key);
@override
Widget build(BuildContext context) {
return TextFormField(
decoration: this.decoration,controller: this.controller,keyboardType: TextInputType.numberWithOptions(decimal: true),inputFormatters: [
WhitelistingTextInputFormatter(RegExp(r'[\d+\-\.]')),NumberTextInputFormatter(decimalRange: this.decimalRange),],);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。