Regex inputFormatter应该只允许十进制数和负数
我想允许用户只添加数字“12345”和十进制数字(如“21321.12312”)以及负数(如-23423.32432)。用户不能在输入的第一个字段中添加多个“.”如“12..32”和“-”如-324.34而不是324-4323。 我使用了这个正则表达式Regex inputFormatter应该只允许十进制数和负数,regex,flutter,dart,inputformatter,Regex,Flutter,Dart,Inputformatter,我想允许用户只添加数字“12345”和十进制数字(如“21321.12312”)以及负数(如-23423.32432)。用户不能在输入的第一个字段中添加多个“.”如“12..32”和“-”如-324.34而不是324-4323。 我使用了这个正则表达式r'^(-d+\.\d+)(\s*,\s*-?\d+\.\d+$”,但无法输入任何内容 文本字段代码: TextFormField( 输入格式化程序:[ FilteringPutFormatter.allow( RegExp(r'^(-d+\.\d
r'^(-d+\.\d+)(\s*,\s*-?\d+\.\d+$”
,但无法输入任何内容
文本字段代码:
TextFormField(
输入格式化程序:[
FilteringPutFormatter.allow(
RegExp(r'^(-d+\.\d+)(\s*,\s*-?\d+\.\d+$),
],
主计长:预算,
键盘类型:TextInputType.number,
装饰:输入装饰(
内容填充:
仅限边集(右:20,左:20,顶部:10,底部:10),
hintText:getTranslated(上下文,“预算”示例),
hintStyle:TextStyle(fontSize:13,fontFamily:“tahoma”),
边框:大纲输入边框(
borderSide:borderSide(宽度:1,颜色:MyColor.secondary),
边界半径:边界半径。圆形(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);
}
}
我刚刚更新了问题。请尝试
RegExp(r'^-?\d+(?:\。\d+)(?:\s*,\s*-?\d+(?:\。\d+)*$)
我试过了。当我输入除数字以外的所有内容时,会清除TextFormFields值。好吧,不知道,但是我建议的正则表达式将允许整数值,而你的不允许。另外,尝试使用keyboardType:TextInputType.numberWithOptions(十进制:true)
代替keyboardType:TextInputType.number
。
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),
],
);
}
}