Luhn算法。银行卡校验算法。java版。
如下java代码。测试代码已经卸载main函数中。
/**
* @Author GW
* @Version 1.0
* @Description Luhn算法。银行卡校验算法。没做字符串数字校验,以后再做吧!
* @since 2020/12/4 20:49
*/
public class Luhn {
public static void main(String[] args) {
String str="7992739871";
String strValue=Luhn.addCheck(str);
System.out.println(strValue);
if (check(strValue)){
System.out.println("校验成功");
}else {
System.out.println("校验失败");
}
}
/**
* 数字字符串添加校验位
* @param digits 不带校验位的数字字符串
* @return 添加校验位的字符串
*/
public static String addCheck(String digits){
return digits+getCheck(digits);
}
/**
* 检查校验位
* @param digits 带校验位的字符串
* @return 检查结果
*/
private static boolean check(String digits) {
return check(numStringToArray(digits));
}
/**
* 获取校验位
* @param digits 不带校验位的字符串
* @return 校验位
*/
private static int getCheck(String digits) {
return getCheck(numStringToArray(digits));
}
//------------------------辅助函数---------------------//
private static Integer[] numStringToArray(String numStr){
byte[] bytes=numStr.getBytes();
List<Integer> list=new ArrayList<>();
for (byte b:bytes){
list.add((int) b-48);
}
Integer[] digits=new Integer[list.size()];
list.toArray(digits);
return digits;
}
private static boolean check(Integer[] digits) {
int sum = 0;
int length = digits.length;
for (int i = 0; i < length; i++) {
int digit = digits[length - i - 1];
if (i % 2 == 1) {
digit *= 2;
}
sum += digit > 9 ? digit - 9 : digit;
}
return sum % 10 == 0;
}
private static int getCheck(Integer[] digits) {
int sum = 0;
int length = digits.length;
for (int i = 0; i < length; i++) {
int digit = digits[length - i - 1];
if (i % 2 == 0) {
digit *= 2;
}
sum += digit > 9 ? digit - 9 : digit;
}
return sum * 9 % 10;
}
}