Flutter 輸入框驗證輸入金錢

涉及金錢使用:
只能錄入數(shù)字,并且錄入的數(shù)字最多保留二位小數(shù)。不會以0開頭,自動轉(zhuǎn)為0.
小數(shù)點只能輸入一個且之后只能輸入兩位數(shù)字
不能輸入除.數(shù)字外的其他字符

使用:

TextField(
    ...
         controller: myController
         keyboardType: TextInputType.numberWithOptions(decimal: true),//由于某些機型鍵盤并不能做到強制故再條件上加上FilteringTextInputFormatter.allow(RegExp('[0-9.,]+')
         inputFormatters: [
                   PrecisionLimitFormatter(2),   
                   FilteringTextInputFormatter.allow(RegExp('[0-9.,]+'))
],
)

輪子:

import 'package:flutter/services.dart';
import 'dart:math' as math;

class PrecisionLimitFormatter extends TextInputFormatter {
  int _scale;

  PrecisionLimitFormatter(this._scale);

  RegExp exp = RegExp(r"[0-9]");
  static const String POINTER = ".";
  static const String DOUBLE_ZERO = "00";
  static const String ZERO = "0";

  @override
  TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) {
    print('oldValue:'+oldValue.text);
    print('newValue:'+newValue.text);
    if(newValue.text.startsWith('.')){
      return TextEditingValue(text: '0.',selection:TextSelection.collapsed(offset: 2));
    }

    // if (newValue.text.startsWith(POINTER) && newValue.text.length == 1) {
    //   //第一個不能輸入小數(shù)點
    //   return oldValue;
    // }

    ///輸入完全刪除
    if (newValue.text.isEmpty) {
      return TextEditingValue();
    }

    ///只允許輸入小數(shù)
    if (!exp.hasMatch(newValue.text)) {
      return oldValue;
    }

    if(newValue.text.startsWith(ZERO) && newValue.text.split("0")[1].startsWith(RegExp(r'[0-9]'))){
      return TextEditingValue(text: '0',selection:TextSelection.collapsed(offset: 1));
      
      // return newValue;
    }

    ///包含小數(shù)點的情況
    if (newValue.text.contains(POINTER)) {
      ///包含多個小數(shù)
      if (newValue.text.indexOf(POINTER) != newValue.text.lastIndexOf(POINTER)) {
        return oldValue;
      }
      String input = newValue.text;
      int index = input.indexOf(POINTER);

      ///小數(shù)點后位數(shù)
      int lengthAfterPointer = input.substring(index, input.length).length - 1;

      ///小數(shù)位大于精度
      if (lengthAfterPointer > _scale) {
        return oldValue;
      }
    } else if (newValue.text.startsWith(POINTER) || newValue.text.startsWith(DOUBLE_ZERO)) {
      ///不包含小數(shù)點,不能以“00”開頭
      return oldValue;
    }
    return newValue;
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容