最近在弄支付,遇到银行卡号的校验规则,根据网上的luhm规则自己写了一个。
public class TestBankCode {
public static void main(String[] args) {
String bankCode = "4381260012501251";
System.out.println(validateluhm(bankCode));
}
/**
* luhm校验
* 从卡号最后一位数字开始,逆向将奇数位相加
* 从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和
* 奇偶相加为10的倍数表示通过
*/
public static boolean validateluhm(String bankCode){
//验证
if(!bankCode.matches("^\\d{16,19}$")){
throw new IllegalArgumentException("bankCode must be 16-19 number,bankCode is : "+bankCode);
}
//倒转
String reverseCode = new StringBuffer(bankCode).reverse().toString();
char[] array = reverseCode.toCharArray();
int sumOdd = 0;
int sumEven = 0;
for(int i = 0;i<reverseCode.length();i++){
int num = Integer.parseInt(String.valueOf(array[i]));
if(i % 2 == 0){ //奇数位
sumEven += num;
}else{ //偶数位
num = num * 2;
if(num > 9){
num = num - 9;
}
sumOdd += num;
}
}
if((sumOdd + sumEven) % 10 == 0){
return true;
}
return false;
}
}