信用卡验证器,调用方法不起作用
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
变量以上是关于信用卡验证器,调用方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章