MOD10信用卡验证

时间:2012-08-18 19:12:05

标签: java validation credit-card

  • 步骤1:将卡号的交替数字的值加倍,从右边的第二个数字开始。
  • 步骤2:添加步骤1中获得的各个数字和原始数字中的每个未受影响的数字。
  • 步骤3:如果步骤2中获得的总数可以被10整除,则卡号有效,否则无效。

E.g。使用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

第2步:4 + (1+8) + 9 + (1+4) + 7 + (6) + 9 + (6) + 7 + (2) + 6 = 70

步骤3:70可被10整除⇒卡号有效

这是问题的第二部分。所以我将cardnumber userInput作为String。这是否意味着我必须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);

        }

3 个答案:

答案 0 :(得分:1)

一些指示:

  • 你应该从数字序列的右侧结束开始,然后向左工作。如果是校验位,则是信用卡号码的最后一位数字。一些信用卡具有奇数个数字,其他信用卡具有偶数个数字。从字符串的“右”端开始是确保正确数字加倍的一种方法。
  • 一些信用卡使用奇数位的事实意味着你不能依赖于能够在每个循环中处理两个字符(至少在没有针对那个奇怪的,剩余字符的特殊情况处理时)。
  • 当你加倍一个数字时,如果你得到一个大于10的结果你想从结果中减去9(有效地将两个数字加在一起),然后再将它折叠成校验和。

答案 1 :(得分:0)

我的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;
}

Luhn algorithm从右端开始,然后将每个其他数字乘以2并添加结果。

  1. 在上面的代码中,我使用Integer.parseInt(str.substring(idx,idx+1))来获取字符串中的每个数字。如果它不是数字,则会抛出错误。
  2. 我检查alt - 标志,如果是真,我将该值乘以2.如果结果大于9,则减去9.这与加1+ [0-8]的结果相同]
  3. 我将值添加到总和并切换alt - 标志。
  4. 如果总和甚至可以被10整除,则结果为真。

答案 2 :(得分:0)

我曾尝试编写符合我的意思的代码:

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]; 
}

您遇到了麻烦,因为您为char中的某个职位分配了int[],因此使用了char的int表示形式。因此,对digitsChar[2]的调用没有失败(它总是应该失败,因为任何数字的两倍都不能超过两位数,而其中一半只有一个),因为{{1}加倍数字int的表示都有三位数。