【备忘录】身份证 银行卡号 校验
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); });