Flutter TextField仅输入十进制数字

qzwqbdag  于 2023-06-24  发布在  Flutter
关注(0)|答案(7)|浏览(167)

我想在Flutter中只输入TextField中的十进制数。我试过下面的代码,但这是不工作。它允许alpha(a-z)和特殊字符。

TextField(
  controller:
      new TextEditingController(text: listDisplay[position].getBlockQty(),
  ),       
  textAlign: TextAlign.center,
  maxLines: 1,       
  keyboardType: TextInputType.numberWithOptions(
      decimal: true,
      signed: false),       
),
gzjq41n4

gzjq41n41#

试试这个:

inputFormatters: [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9.]")),
        TextInputFormatter.withFunction((oldValue, newValue) {
          try {
            final text = newValue.text;
            if (text.isNotEmpty) double.parse(text);
            return newValue;
          } catch (e) {}
          return oldValue;
        }),
      ],

演示:

TextFormField(
      keyboardType:
          TextInputType.numberWithOptions(decimal: true, signed: false),
      onChanged: _yourOnChange,
      inputFormatters: [
        FilteringTextInputFormatter.allow(RegExp(r"[0-9.]")),
        TextInputFormatter.withFunction((oldValue, newValue) {
          try {
            final text = newValue.text;
            if (text.isNotEmpty) double.parse(text);
            return newValue;
          } catch (e) {}
          return oldValue;
        }),
      ],
    )
vcirk6k6

vcirk6k62#

在这种情况下,您可以使用TextInputFormatter
这里有一个例子,
子类TextInputFormatter

import 'package:flutter/services.dart';

class RegExInputFormatter implements TextInputFormatter {
  final RegExp _regExp;

  RegExInputFormatter._(this._regExp);

  factory RegExInputFormatter.withRegex(String regexString) {
    try {
      final regex = RegExp(regexString);
      return RegExInputFormatter._(regex);
    } catch (e) {
      // Something not right with regex string.
      assert(false, e.toString());
      return null;
    }
  }

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    final oldValueValid = _isValid(oldValue.text);
    final newValueValid = _isValid(newValue.text);
    if (oldValueValid && !newValueValid) {
      return oldValue;
    }
    return newValue;
  }

  bool _isValid(String value) {
    try {
      final matches = _regExp.allMatches(value);
      for (Match match in matches) {
        if (match.start == 0 && match.end == value.length) {
          return true;
        }
      }
      return false;
    } catch (e) {
      // Invalid regex
      assert(false, e.toString());
      return true;
    }
  }
}

在文本字段中使用它

final _amountValidator = RegExInputFormatter.withRegex('^\$|^(0|([1-9][0-9]{0,}))(\\.[0-9]{0,})?\$');
...
TextField(
  inputFormatters: [_amountValidator],
  keyboardType: TextInputType.numberWithOptions(
    decimal: true,
     signed: false,
   ),
 )
raogr8fs

raogr8fs3#

我正在使用这个代码,它给出了不同的结果,在一些手机上它只显示数字,在其他人它显示破折号和其他字符,所以它取决于启动器或类似的东西,我猜,在iPhone我猜它会显示正确的键盘(我已经尝试在iPhone 7s加).
inputFormatters将只允许数字,所以你会得到你想要的。

TextField(
     textAlign: TextAlign.start,
     keyboardType: TextInputType.numberWithOptions(decimal: true),
     inputFormatters: <TextInputFormatter>[
                          FilteringTextInputFormatter.digitsOnly
                       ],
   ),
ewm0tg9j

ewm0tg9j4#

添加inputFormatters行:

TextField(
     inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}'))],
          ...)
bn31dyow

bn31dyow5#

我也一直在寻找这个问题的答案,经过多次尝试和努力,终于找到了。
你可以用这个正则表达式来表示decimal。

inputFormatters: [
        FilteringTextInputFormatter.allow(RegExp(r'^[0-9]+.?[0-9]*'))
      ],
egdjgwm8

egdjgwm86#

我已经在我的一个项目中使用了这个代码,它的工作很好。我希望它会对你有所帮助。

TextField(
         decoration: InputDecoration(
         border: InputBorder.none,
         hintText: "Amount",
         hintStyle:
         TextStyle(color: Colors.grey, fontSize: 12.0),
         ),
         style: TextStyle(color: Colors.black, fontSize: 12.0),
         controller: _amountController[index],
         textInputAction: TextInputAction.done,
         keyboardType: TextInputType.numberWithOptions(decimal: true),)

xsuvu9jc

xsuvu9jc7#

试试这个十进制

import 'package:flutter/services.dart';
...
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [FilteringTextInputFormatter.allow(RegExp('[0-9.,]+')),],
onChanged: (value) => doubleVar = double.parse(value),


RegExp('([0-9]+(.[0-9]+)?)')对于允许数字和只有一个点

相关问题