Java MOD10信用卡验证 步骤1:从右边第二位开始,将卡号的备用数字值加倍 步骤2:将步骤1中获得的单个数字与原始数字中未受影响的每个数字相加 第三步:如果第二步得到的总数可以被10整除,则卡号有效,否则无效
例如,使用Mod 10算法验证VISA卡49977393716的卡号: 步骤1:Java MOD10信用卡验证 步骤1:从右边第二位开始,将卡号的备用数字值加倍 步骤2:将步骤1中获得的单个数字与原始数字中未受影响的每个数字相加 第三步:如果第二步得到的总数可以被10整除,则卡号有效,否则无效,java,validation,credit-card,Java,Validation,Credit Card,例如,使用Mod 10算法验证VISA卡49977393716的卡号: 步骤1: 4 9 9 7 7 3 9 3 7 1 6 x2 x2 x2 x2 x2 = 18 14 6 6 2 第二步:4+(1+8)+9+(1+4)+7+(6)+9+(6)+7+(2)+6=70 步骤3:70可以被10整除⇒ 卡号是有效的 这是问题的第二部分。所以我得到了cardnumber用户输入作为字符串。这是否意味着我必须使用charAt(),所需的字符//替换值 int[] digits
4 9 9 7 7 3 9 3 7 1 6
x2 x2 x2 x2 x2
= 18 14 6 6 2
第二步:4+(1+8)+9+(1+4)+7+(6)+9+(6)+7+(2)+6=70
步骤3:70可以被10整除⇒ 卡号是有效的
这是问题的第二部分。所以我得到了cardnumber用户输入作为字符串。这是否意味着我必须使用charAt(),所需的字符//替换值
int[] digits = new int[cardNo.length()/2];//Number of alternate values available
char digit1;
char digit2;
int intDigit1;
int intDigit2;
int[] sumOfTwoDigits = new int[cardNo.length()/2];
int totalSum;
String digitsChar;
for(int i=0; i<digits.length; i++){
digits[i]=(cardNo.charAt(i+1))*2;
digitsChar=Integer.toString(digits[i]);
digit1= digitsChar.charAt(1);
digit2= digitsChar.charAt(2);
intDigit1= Character.getNumericValue(digit1);//Convert char to int to perform addition
intDigit2= Character.getNumericValue(digit2);//Convert char to int to perform addition
sumOfTwoDigits[i] = intDigit1+intDigit2;
System.out.println("digits: " + intDigit1);
}
int[]位=新的int[cardNo.length()/2]//可用替代值的数量
字符数字1;
字符数字2;
int intDigit1;
int intDigit2;
int[]sumOfTwoDigits=new int[cardNo.length()/2];
整数和;
字符串digitsChar;
对于(int i=0;i几个指针:
- 您应该从数字序列的右端开始,然后向左操作。信用卡号中的最后一个数字是支票数字。有些信用卡的数字是奇数,有些信用卡的数字是偶数。从字符串的“右”端开始是确保正确数字加倍的一种方法
- 事实上,一些信用卡使用奇数位数意味着你不能依赖于在每个循环中处理两个字符(至少不能不处理那个奇数、剩余字符的特殊情况)
- 当你将一个数字加倍时,如果你得到的结果大于10,你想在将结果折成校验和之前从结果中减去9(实际上是将两个数字相加)
我的java有点生锈,但现在我们开始:
public static boolean luhnVerify(String str) {
int sum = 0;
int value;
int idx = str.length(); // Start from the end of string
boolean alt = false;
while(idx-- > 0) {
// Get value. Throws error if it isn't a digit
value = Integer.parseInt(str.substring(idx, idx + 1));
if (alt) {
value *= 2;
if (value > 9) value -= 9;
}
sum += value;
alt = !alt; //Toggle alt-flag
}
return (sum % 10) == 0;
}
从右端开始,然后每隔一个数字乘以2,将结果相加
在上面的代码中,我使用Integer.parseInt(str.substring(idx,idx+1))
从字符串中获取每个数字。如果它不是数字,将抛出错误
在那里,我检查alt
-标志,如果它是真的,我将值乘以2。如果结果大于9,我减去9。这给出了与加1+[0-8]相同的结果
我将该值添加到总和,并切换alt
-标志
如果总和可被10整除,则结果为真
我曾尝试编写代码,以实现我猜您的意图:
String cardNo = "49977393716";
int[] digits = new int[cardNo.length()/2]; //Number of alternate values available
int[] sumOfTwoDigits = new int[cardNo.length()/2];
for(int i=0; i<digits.length; i++){
//get the numeric value of the char, instead of the int representation
digits[i]=Character.getNumericValue(cardNo.charAt(2*i+1))*2;
//using Michael Burr's trick
sumOfTwoDigits[i] = digits[i] >= 10 ? digits[i] - 9 : digits[i];
}
String cardNo=“49977393716”;
int[]digits=new int[cardNo.length()/2];//可用替代值的数量
int[]sumOfTwoDigits=new int[cardNo.length()/2];
对于(int i=0;它们运行,但逻辑中的某个地方是错误的。我每次迭代都得到0这是什么语言?@leppie这不是javascript。@有些人:哦,没有注意到System.out.println
;p所以java!哦,我不知道这是算法,所以00000000000
是有效的CC号?@dualed从技术上讲,00000000000是有效的since它有正确的校验和。但是,如果它被排除在标准的某个地方,我不会感到惊讶。它通常用于表示没有输入任何号码。因此,永远不会有一个帐户附加到该卡号。请记住,Luhn算法的目的是检测号码是否输入错误。验证y如果该卡有效,您必须与发卡机构进行在线检查。