【备忘录】身份证 银行卡号 校验

function calcChecksum(rid){
  var arr = rid.split('').reverse();
  function W(i){
    return Math.pow(2,i-1) % 11;
  }
  function S(){
    var sum = 0;
    for (var j=0;j<17;j++){
      sum += arr[j]*W(j+2);
    }
    return sum;
  }
  var ret = (12-(S() % 11)) % 11;
  return ret === 10 ? 'X' : ret;
}

// 银行卡号 未带校验位的15(或18)位从右依次奇数位数字乘以2,乘积的个十位相加再加上偶数位上数字加上校验位能被10整除
function checkAccountNumber(number) {
  let arr = number.split(''),
      checkbit = parseInt(arr.splice(arr.length - 1, 1)[0]),
      total = 0;
  arr.reverse();
  arr.map((item, i) => {
    item = parseInt(item);
    if (i % 2 === 0) { // odd
      let doubleItem = item * 2;
      if (doubleItem < 10)
        total += doubleItem;
      else
        total += (doubleItem - 9);
    } else { // even
      total += item;
    }
  });
  total += checkbit;
  return total % 10 === 0;
}

Vue.validator('idnumber', (rule) => {
  if (val.length != 18) return false;
  var lastChar = calcChecksum(val.substr(0, 17));
  return lastChar == val[17];
});

Vue.validator('accountnumber', val => {
  if (val.length !== 16 && val.length !== 19) return false;
  return checkAccountNumber(val);
});

 

posted @ 2016-11-22 10:12  xiaoroad  阅读(331)  评论(0编辑  收藏  举报