Flutter TextField利用 正则和输入监听 设置只能输入零和非零开头的最多带两位小数的数字(整数或小数)

1.在自定义TextInputFormatter中使用正则以及相关逻辑

/// 只能输入零和非零开头的最多带两位小数的数字
class _OnlyInputNumberWithDecimalPointFormatter extends TextInputFormatter {
  final _regExp = RegExp(r"^(0|[1-9][0-9]*)+(\.[0-9]{1,2})?$");

  // final _regExp = RegExp(r"^[0-9]+(\.[0-9]{1,2})?$");

  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    if (newValue.text.isNotEmpty) {
      if (_regExp.firstMatch(newValue.text) != null) {
        if (oldValue.text.length == 1 && oldValue.text == "0") {
          if (newValue.text.length == 2 && newValue.text.endsWith("0")) {
            // 避免连续输入0
            return oldValue;
          } else if (newValue.text.length == 2 &&
              !newValue.text.endsWith("0") &&
              !newValue.text.endsWith(".")) {
            // 避免输入01、02、03、...
            var realNewValue = newValue.text.substring(1);
            return TextEditingValue(
                text: realNewValue,
                selection:
                    TextSelection.collapsed(offset: realNewValue.length));
          }
        }
        return newValue;
      } else if (!oldValue.text.contains(".") && newValue.text.contains(".")) {
        // 输入时:正则有点问题,无法输入小数点,在这里处理小数点
        return newValue;
      } else if (oldValue.text.length > newValue.text.length &&
          (oldValue.text.indexOf(".") == oldValue.text.length - 2) &&
          newValue.text.endsWith(".")) {
        // 删除时:正则有点问题,无法删除小数点,在这里处理小数点
        var realNewValue = newValue.text.split(".")[0];
        return TextEditingValue(
            text: realNewValue,
            selection: TextSelection.collapsed(offset: realNewValue.length));
      }
      return oldValue;
    }
    return newValue;
  }
}

2.组装成函数调用

/// 只能输入零和非零开头的最多带两位小数的数字
  static TextInputFormatter onlyInputNumberWithDecimalPointFormatter() {
    return _OnlyInputNumberWithDecimalPointFormatter();
  }

3.在TextField中使用

                                TextField(
                                  cursorColor: AppColor.appThemeColor,
                                  controller: model.yueEditController,
                                  style: AppTextStyle.stC000000S14W400,
                                  decoration: InputDecoration(
                                    contentPadding: const EdgeInsets.all(0),
                                    hintText: "输入转入金额",
                                    hintStyle: AppTextStyle.stC666666S14,
                                    border: InputBorder.none,
                                    focusedBorder: InputBorder.none,
                                  ),
                                  keyboardType:
                                      const TextInputType.numberWithOptions(
                                          decimal: true),
                                  inputFormatters: [
                                    xxx.onlyInputNumberWithDecimalPointFormatter(),
                                  ],
                                )

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值