最近在弄支付,遇到银行卡号的校验规则,根据网上的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; } }