Flutter自定义TextInputFormatter实现金额输入框,同时解决iOS数字键盘不能 ...

打印 上一主题 下一主题

主题 753|帖子 753|积分 2259

一、实现的效果

二、金额输入框基本要求



  • 只能输入.和数字
  • 小数点后只能有俩位
  • 小数点不能作为开头
三、在iOS装备上这里另有个坑,数字键盘上这个小数点会根据你手机设置的不同国家地区来决定表现是.照旧, 如下

   所以这个时候最好的解决办法是答应输入.、数字和,然后在动态的将,替换成.
  四、完整代码

  1. import 'package:flutter/services.dart';
  2. class AmountTextFieldFormatter extends FilteringTextInputFormatter {
  3.   final int digit;
  4.   final String _decimalComma = ',';
  5.   final String _decimalDot = '.';
  6.   String _oldText = '';
  7.   AmountTextFieldFormatter({
  8.     this.digit = 2,
  9.     bool allow = true,
  10.   }) : super(RegExp('[0-9.,]'), allow: allow);
  11.   @override
  12.   TextEditingValue formatEditUpdate(
  13.     TextEditingValue oldValue,
  14.     TextEditingValue newValue,
  15.   ) {
  16.     ///替换`,`为`.`
  17.     if (newValue.text.contains(_decimalComma)) {
  18.       newValue = newValue.copyWith(
  19.         text: newValue.text.replaceAll(_decimalComma, _decimalDot),
  20.       );
  21.     }
  22.     final handlerValue = super.formatEditUpdate(oldValue, newValue);
  23.     String value = handlerValue.text;
  24.     int selectionIndex = handlerValue.selection.end;
  25.     ///如果输入框内容为.直接将输入框赋值为0.
  26.     if (value == _decimalDot) {
  27.       value = '0.';
  28.       selectionIndex++;
  29.     }
  30.     if (_getValueDigit(value) > digit || _pointCount(value) > 1) {
  31.       value = _oldText;
  32.       selectionIndex = _oldText.length;
  33.     }
  34.     _oldText = value;
  35.     return TextEditingValue(
  36.       text: value,
  37.       selection: TextSelection.collapsed(offset: selectionIndex),
  38.     );
  39.   }
  40.   ///输入多个小数点的情况
  41.   int _pointCount(String value) {
  42.     int count = 0;
  43.     value.split('').forEach((e) {
  44.       if (e == _decimalDot) {
  45.         count++;
  46.       }
  47.     });
  48.     return count;
  49.   }
  50.   ///获取目前的小数位数
  51.   int _getValueDigit(String value) {
  52.     if (value.contains(_decimalDot)) {
  53.       return value.split(_decimalDot)[1].length;
  54.     } else {
  55.       return -1;
  56.     }
  57.   }
  58. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表