微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。