JS金额校验

1,876 阅读1分钟

校验规则:(实时校验)

  • 不以任何字符开头或结尾
  • 以小数点开头,小数点前加0补位 [ .26 -> 0.26 ]
  • 0之后除小数点外不可以加任何数字或符号
  • 不能输入多个小数点
  • 小数点后截至两位
  • 针对于0 0.0 0.00 的 判断
  • 失焦后或提交时 小数点后不足两位自动补0 [ 0.2 -> 0.20 ]
onNumChange = e => {
    const num = e.target.value;
    console.log(num);

    if (!/^[\d\.]*$/.test(num)) return// 包含特殊字符,阻止更新state

    if (num[0] === '.') return// 第一位是小数点,阻止更新state

    if (num[0] === '0') { // 第一位是0
        if (num[1] && num[1] !== '.') return// 第二位存在且不是小数点,阻止更新state
    }

    if (num.split('').filter(s => s === '.').length > 1) return// 包含多个小数点,阻止更新state

    if (num.includes('.')) { // 小数
        if (num.split('.')[1].length > 2) return// 小数位大于2,阻止更新state
    }

    if (!/\d+\.$/.test(num)) { // 以小数点结尾 按钮禁用置灰
        this.setState({
            isDisabled: true // isDisabled 按钮是否禁用
        });
    }

    if (num === '0' || num === '0.0' || num === '0.00') {
        this.setState({
            isDisabled: true // isDisabled 按钮是否禁用
        });
    }

    this.setState({
        numVal: num
    }, () => {
        // 实时调接口
    });
}
    
inputBlur = () => {
    let num = this.state.numVal;
    if (num.includes('.')) { // 存在小数
        let [num1, num2] = num.split('.');
        num2 = num2.padEnd(2, '0'); // 小数点后不足两位自动补全
        num = `${num1}.${num2}`;
    } else// 整数
        num += '.00';
    }
    
    this.setState({
        numVal: num
    });
}

待修改

patternType: {
    //正数类型
    'positive'/^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|[1-9]\d*$/
    
    // 最多两位小数
    'is2Decimal'/^\d+\.?\d{0,2}$/
    
    // 最多六位小数
    'is6Decimal'/^\d+\.?\d{0,6}$/
    'isMobileNumber'/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\d{8}|1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\d{8}|1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\d{8}|1(3[3]|4[9]|53|7[037]|8[019])\d{8}$/,
    'isMail'/^[a-zA-Z0-9]+([._\\-]*[a-zA-Z0-9])*@([a-zA-Z0-9]+[-a-zA-Z0-9]*[a-zA-Z0-9]+.){1,63}[a-zA-Z0-9]+$/
    'isMailRational'/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,5})+$/
    'isSpecialChar''[`~!@#$^&*()=|{}\':;\',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“\'。,、?]'
    
    //正数类型
    'positiveRational'/^-?[1-9]\d*\.\d*|-?0\.\d*[1-9]\d*|-?[1-9]\d*$/
    
    // 最多两位小数
    'is2DecimalRational'/^-?\d+\.?\d{0,2}$/

    // 最多三位小数
    'is3Decimal'/^\d+\.?\d{0,3}$/

    // 最多十位小数
    'is10Decimal'/^\d+\.?\d{0,10}$/
    'isSpecialCharFP'/[<>/]/
    'isPositive'/^[1-9]\d*$/
    
    // 密码
    'isOldPwd'/(^(\w){6,20}$)|(^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$)/,
    'isPwd'/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
  },