银行卡号码的校验采用Luhn算法,校验过程大致如下:
-
从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….
-
从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。
-
对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。
-
如果s能够整除10,则此号码有效,否则号码无效。
因为最终的结果会对10取余来判断是否能够整除10,所以又叫做模10算法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static Boolean validCheckNum(String cardNo){
int sum = 0;
for (int i = 1; i <= cardNo.length(); i++) {
int unit = cardNo.charAt(i-1) - '0';
if ((i & 1) == 0) {
unit = unit * 2;
if (unit > 9) {
unit = unit / 10 + unit % 10;
}
}
sum += unit;
}
return sum % 10 == 0 ? Boolean.TRUE : Boolean.FALSE;
}
|
计算校验码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int sum = 0;
for (int i = 0; i < cardNo.length(); i++) {
int unit = cardNo.charAt(cardNo.length()-1 - i) - '0';
if ((i & 1) == 0) {
if (unit < 5) {
sum += unit * 2;
} else {
sum += unit * 2 - 9;
}
} else {
sum += unit;
}
}
int remainder = sum % 10;
|
引用
卢恩算法