银行卡校验规则(Luhn算法)

luhmCheck: bankno => {
var lastNum = bankno.substr(bankno.length - 1, 1) // 取出最后一位(与luhm进行比较)

var first15Num = bankno.substr(0, bankno.length - 1) // 前15或18位
var newArr = []
for (var i = first15Num.length - 1; i > -1; i--) {
// 前15或18位倒序存进数组
newArr.push(first15Num.substr(i, 1))
}
var arrJiShu = [] // 奇数位*2的积 <9
var arrJiShu2 = [] // 奇数位*2的积 >9

var arrOuShu = [] // 偶数位数组
for (var j = 0; j < newArr.length; j++) {
if ((j + 1) % 2 === 1) {
// 奇数位
if (parseInt(newArr[j]) * 2 < 9) {
arrJiShu.push(parseInt(newArr[j]) * 2)
} else {
arrJiShu2.push(parseInt(newArr[j]) * 2)
}
} else {
arrOuShu.push(newArr[j])
}
}

var jishuChild1 = [] // 奇数位*2 >9 的分割之后的数组个位数
var jishuChild2 = [] // 奇数位*2 >9 的分割之后的数组十位数
for (var h = 0; h < arrJiShu2.length; h++) {
jishuChild1.push(parseInt(arrJiShu2[h]) % 10)
jishuChild2.push(parseInt(arrJiShu2[h]) / 10)
}

var sumJiShu = 0 // 奇数位*2 < 9 的数组之和
var sumOuShu = 0 // 偶数位数组之和
var sumJiShuChild1 = 0 // 奇数位*2 >9 的分割之后的数组个位数之和
var sumJiShuChild2 = 0 // 奇数位*2 >9 的分割之后的数组十位数之和
var sumTotal = 0
for (var m = 0; m < arrJiShu.length; m++) {
sumJiShu = sumJiShu + parseInt(arrJiShu[m])
}

for (var n = 0; n < arrOuShu.length; n++) {
sumOuShu = sumOuShu + parseInt(arrOuShu[n])
}

for (var p = 0; p < jishuChild1.length; p++) {
sumJiShuChild1 = sumJiShuChild1 + parseInt(jishuChild1[p])
sumJiShuChild2 = sumJiShuChild2 + parseInt(jishuChild2[p])
}
// 计算总和
sumTotal =
parseInt(sumJiShu) +
parseInt(sumOuShu) +
parseInt(sumJiShuChild1) +
parseInt(sumJiShuChild2)

// 计算Luhm值
var k = parseInt(sumTotal) % 10 === 0 ? 10 : parseInt(sumTotal) % 10
var luhm = 10 - k

if (+lastNum === luhm && lastNum.length !== 0) {
return true
} else {
return false
}
},
原文地址:https://www.cnblogs.com/gudun/p/9521910.html