JS校验银行卡号、身份证号

银行卡校验

备注:小程序代码没加分号; 需要记得添加

bankCardValid(bankCardNum) {
  let res = (bankCardNum + '').match(/[0-9]+/)
  if (!res) return false
  if (res[0].length < 13 && res[0].length > 19) return false
  const lastNum = parseInt(bankCardNum.substr(bankCardNum.length - 1, 1), 10)
  const first15Num = bankCardNum.substr(0, bankCardNum.length - 1)
  const newArr = []
  for (let i = first15Num.length - 1; i > -1; i--) {
    newArr.push(parseInt(first15Num.substr(i, 1), 10))
  }
  const arrJiShu = [] // 奇数位*2的积 >9
  let sumJiShu = 0 // 奇数位*2 < 9 的数组之和
  let sumOuShu = 0 // 偶数位数组之和
  for (let j = 0; j < newArr.length; j += 1) {
    if ((j + 1) % 2 === 1) {
      if (newArr[j] * 2 < 9) {
        sumJiShu += newArr[j] * 2
      } else {
        arrJiShu.push(newArr[j] * 2)
      }
    } else {
      sumOuShu += newArr[j]
    }
  }
  let sumJiShuChild1 = 0 // 奇数位*2 >9 的分割之后的数组个位数之和
  let sumJiShuChild2 = 0 // 奇数位*2 >9 的分割之后的数组十位数之和
  for (let h = 0; h < arrJiShu.length; h++) {
    sumJiShuChild1 += arrJiShu[h] % 10
    sumJiShuChild2 += parseInt(arrJiShu[h] / 10, 10)
  }
  const sumTotal = sumJiShu + sumOuShu + sumJiShuChild1 + sumJiShuChild2
  const k = sumTotal % 10 === 0 ? 10 : sumTotal % 10
  const luhn = 10 - k
  if (lastNum === luhn) {
    return true
  } else {
    return false
  }
},

身份证校验

identityCodeValid(_code) {
 let code = _code;
 // 身份证校验支持15位和18位,支持地址编码校验、出身日期、校验位校验
 const city = {
   11: '北京',
   12: '天津',
   13: '河北',
   14: '山西',
   15: '内蒙古',
   21: '辽宁',
   22: '吉林',
   23: '黑龙江 ',
   31: '上海',
   32: '江苏',
   33: '浙江',
   34: '安徽',
   35: '福建',
   36: '江西',
   37: '山东',
   41: '河南',
   42: '湖北 ',
   43: '湖南',
   44: '广东',
   45: '广西',
   46: '海南',
   50: '重庆',
   51: '四川',
   52: '贵州',
   53: '云南',
   54: '西藏 ',
   61: '陕西',
   62: '甘肃',
   63: '青海',
   64: '宁夏',
   65: '新疆',
   71: '台湾',
   81: '香港',
   82: '澳门',
   91: '国外 ',
 };
 let pass = true;
 if (!code ||
   (!/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/i.test(code) &&
     !/^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$/i.test(code))) {
   // 身份证号格式错误
   pass = false;
 } else if (!city[code.substr(0, 2)]) {
   // 地址编码错误
   pass = false;
 } else {
   if (code.length === 18) {
     code = code.split('');
     // ∑(ai×Wi)(mod 11)
     // 加权因子
     const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
     // 校验位
     const parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
     let sum = 0;
     let ai = 0;
     let wi = 0;
     for (let i = 0; i < 17; i++) {
       ai = code[i];
       wi = factor[i];
       sum += ai * wi;
     }
     if (parity[sum % 11].toUpperCase() !== code[17].toUpperCase()) {
       // 校验位错误
       pass = false;
     }
   }
 }
 return pass;
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值