银行卡号校验规则

银行卡号校验规则

昨天写了身份证编号的校验规则,今天顺便写下银行卡的校验规则。

常见的输入类信息都有校验规则,方便检查用户输入,银行卡号码也不例外,也特别需要,毕竟是一长串无规则数字,记忆和输入难免出错。

银行卡号码的校验采用Luhn算法

校验过程大致如下:

  1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….

  2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。

  3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。

  4. 如果s能够整除10,则此号码有效,否则号码无效。

  5. 因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。

javascript代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

//检查是否为合法的银行卡号
//bankCardNo: 银行卡号,数字或字符串
//return: true:有效; false:无效。
//important: 算法内部假定有效的卡号为16位或19位
function luhn(bankCardNo){
if(typeof bankCardNo !== 'string' && !Number.isInteger(bankCardNo)){
return false;
}

if(Number.isInteger(bankCardNo)){
bankCardNo = bankCardNo + "";
}


if(!RegExp('^[0-9]+$').test(bankCardNo)){
return false;
}

if(bankCardNo.length != 16 && bankCardNo !=19){
return false;
}

nums = bankCardNo.split('');
numsReverse = nums.reverse();
let sum = 0;
for(let i=1; i<=numsReverse.length; i++){
let t = Number.parseInt(nums[i-1]);
if((i % 2) === 0){
t = t * 2;
}
if(t >= 10){
t = ((t - (t % 10)) / 10) + (t % 10);
}
sum += t;
}


return (sum % 10) === 0;
}