Created
May 29, 2018 11:50
-
-
Save Acvrock/f3998dbc3ea87c695e2e7fb724bb2faf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class BankCardValidate { | |
/* | |
校验过程: | |
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。 | |
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,将个位十位数字相加,即将其减去9),再求和。 | |
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。 | |
*/ | |
/** | |
* 校验银行卡卡号 | |
*/ | |
public static boolean checkBankCard(String bankCard) { | |
if(bankCard.length() < 15 || bankCard.length() > 19) { | |
return false; | |
} | |
char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1)); | |
if(bit == 'N'){ | |
return false; | |
} | |
return bankCard.charAt(bankCard.length() - 1) == bit; | |
} | |
/** | |
* 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 | |
* @param nonCheckCodeBankCard | |
* @return | |
*/ | |
public static char getBankCardCheckCode(String nonCheckCodeBankCard){ | |
if(nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0 | |
|| !nonCheckCodeBankCard.matches("\\d+")) { | |
//如果传的不是数据返回N | |
return 'N'; | |
} | |
char[] chs = nonCheckCodeBankCard.trim().toCharArray(); | |
int luhmSum = 0; | |
for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) { | |
int k = chs[i] - '0'; | |
if(j % 2 == 0) { | |
k *= 2; | |
k = k / 10 + k % 10; | |
} | |
luhmSum += k; | |
} | |
return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment