信用卡验证器,调用方法不起作用

Posted

技术标签:

【中文标题】信用卡验证器,调用方法不起作用【英文标题】:Credit card validator , calling method doesn't work 【发布时间】:2018-01-18 17:25:23 【问题描述】:

我对 java 比较陌生,我正在尝试尽可能地分解我的代码。这个问题实际上是关于如何组织方法来协同工作

如果checkSum() 代码以validateCreditCard() 方法编写,我的信用卡验证器就可以工作。我认为这很奇怪,因为它在被 checkDigitControl() 方法调用时有效

我将这些资源用于程序的逻辑:

检查~https://www.creditcardvalidator.org/articles/luhn-algorithm

生成~https://en.wikipedia.org/wiki/Luhn_mod_N_algorithm

这是我的代码(如果比较笨拙,我提前道歉)

public class CreditCards 

    public static void main(String[] args) 
        long num;

        num = genCreditCard();
        boolean bool = validateCreditCard(num);

    
    // Validity Check
    public static boolean validateCreditCard(long card) 
        String number = card+"";
        String string=null;

        int i;
        for(i=0; i<number.length()-1; i++) //Populate new string, leaving out last digit.
            string += number.charAt(i)+"";
        
        String checkDigit = number.charAt(i)+"";// Stores check digit.

        long sum = checkSum(string);// Program works if this line is swapped for the code below(from checkSum)
        //**********************************************************************
//        int[] digits = new int[number.length()];
//        int lastIndex = digits.length-1;
//        int position=2; int mod=10;
//        int sum=0;
//
//        for(int j=lastIndex; j>=0; j--) // Populate array in REVERSE
//            digits[j] = Integer.parseInt(number.charAt(j)+"");
//            digits[j] *= ( (position%2 == 0) ? 2: 1 );// x2 every other digit FROM BEHIND
//            position++;
//
//            digits[j] = ( (digits[j] > 9) ? (digits[j] / mod)+(digits[j] % mod) : digits[j] );//Sums integers of  double-digits
//            sum += digits[j];
//        
        //**********************************************************************
        sum *= 9;
        string = sum+"";
        string = string.charAt(string.length()-1)+"";// Last digit of result.

        return (string.equals(checkDigit));
    

    public static long genCreditCard() 
        String number = "34";// American Express(15 digits) starts with 34 or 37
        for(int i=0; i<12; i++)
            number += (int)(Math.random() * 10) + "";// Add 12 random digits 4 base.

        number += checkDigitControl(number);// Concat the check digit.
        System.out.println(number);
        return Long.parseLong(number);
    
    // Algorithm to calculate the last/checkSum digit.
    public static int checkDigitControl(String number) 
        int i;
        for(i=0; i<5; i++)
            ++i;
        int sum = checkSum(number);
        return 10 - sum%10;// Returns number that makes checkSum a multiple of 10.
    

    public static int checkSum(String number) 
        int[] digits = new int[number.length()];
        int lastIndex = digits.length-1;
        int position=2; int mod=10;
        int sum=0;

        for(int j=lastIndex; j>=0; j--) // Populate array in REVERSE
            digits[j] = Integer.parseInt(number.charAt(j)+"");
            digits[j] *= ( (position%2 == 0) ? 2: 1 );// x2 every other digit FROM BEHIND
            position++;

            digits[j] = ( (digits[j] > 9) ? (digits[j] / mod)+(digits[j] % mod) : digits[j] );//Sums integers of  double-digits
            sum += digits[j];
        
        return sum;
    


提前谢谢,如果格式不正确,请见谅;这也是我的第一个 *** 帖子¯\_(ツ)_/¯

【问题讨论】:

哇!我不知道 *** 这么有用。非常感谢您的帮助。 我还有一个问题,如果问题是分配给null,那么为什么在validateCreditCard()方法中使用string时不影响它,只有当它是传入checkSum() 因为在您评论的代码中您使用了number 变量而不是string 变量。 number 是实际的信用卡号。相反,在checkSum 方法中,您传递了错误的字符串变量。很高兴为您提供帮助,如果答案对您有帮助,请考虑接受。这就是***的工作原理。 ***.com/help/someone-answers 并且下次您可以直接在答案下方发表评论,以便回答的人会收到您的消息通知。如果您在此处在您的问题下发表评论,您必须用@username 标记此人,如果您希望他收到您的消息通知。 meta.stackexchange.com/questions/125208/… 感谢 *** 提示。我会在你的答案下发表评论 【参考方案1】:

您正在使用空值初始化变量字符串:

String string=null;

在下面为您将卡号的每个字符添加到此字符串中。

for(i=0; i<number.length()-1; i++) 
    string += number.charAt(i)+"";

但是这样会导致变量string为null + cardnumbers,因为你没有初始化Stringstring,值null转换为字符串"null"(Concatenating null strings in Java)

这将修复您的代码:

String string = new String();

注意,这段代码:

for(i=0; i<number.length()-1; i++) 
     string += number.charAt(i)+"";

可以很容易地用做同样事情的这一行替换:

number = number.substring(0, number.length() -1);

如果您切换到此代码,只需将 number 传递给 checkSum 方法

【讨论】:

我还有一个问题,如果问题是赋值给null,那么为什么在validateCreditCard()方法中使用字符串时不影响它,只有当它被传递到@ 987654333@。抱歉,我还是不太明白你的回复。 validateCreditCard 方法中,在long sum = checkSum(string);(注释代码)之后,您使用number 变量来获取信用卡的数字(int[] digits = new int[number.length()];),因为您从checkSum 方法中复制了代码其中number 变量是参数 (checkSum(String number))。在 validateCreditCard 中,您声明了另一个 number 变量 (String number = card+"";),其中包含信用卡号,因此不为空,并用于代替 string 变量。因此,当您使用注释代码时,您不使用 string 变量,而是使用 number 变量

以上是关于信用卡验证器,调用方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自动完成=关闭在 chrome 中不起作用

带有回调的欧芹验证不起作用

Payu的支付api验证不起作用

调用 GenerateChangePhoneNumberTokenAsync() 后身份电子邮件验证不起作用

用信用卡付款不起作用

带有帐户过滤器的 LinkToken - 信用卡/信用卡 - 不起作用