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);
});