Regex inputFormatter应该只允许十进制数和负数

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

我想允许用户只添加数字“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+)(\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),
      ],
    );
  }
}