Java 使用Luhn算法进行信用卡检查

Java 使用Luhn算法进行信用卡检查,java,Java,我正在尝试用JAVA制作一个应用程序,它将检查用户输入的信用卡号是否有效 以下是模数10检查的步骤: 第1步:从右到左每秒钟两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字 步骤2:现在添加步骤1中的所有单个数字 步骤3:在卡号中从右到左的奇数处添加所有数字 步骤4:将步骤2和步骤3的结果相加 步骤5:如果步骤4的结果可以被10整除,则卡号有效;否则无效。在这种情况下,卡号无效–因为75不能被10整除 我到目前为止的问题是,我尝试的每一个卡号(使用有效号码)都被

我正在尝试用JAVA制作一个应用程序,它将检查用户输入的信用卡号是否有效

以下是模数10检查的步骤:

第1步:从右到左每秒钟两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字

步骤2:现在添加步骤1中的所有单个数字

步骤3:在卡号中从右到左的奇数处添加所有数字

步骤4:将步骤2和步骤3的结果相加

步骤5:如果步骤4的结果可以被10整除,则卡号有效;否则无效。在这种情况下,卡号无效–因为75不能被10整除

我到目前为止的问题是,我尝试的每一个卡号(使用有效号码)都被告知它是无效的。我试着使用调试工具,但看起来我的sum值总是错误的。我需要帮助弄清楚我在计算中哪里搞砸了,或者我是否遗漏了什么

public class CreditCardChecker {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    Scanner sc = new Scanner(System.in);

    System.out.println("Enter credit card number to check validity: ");
    System.out.println();
    String cardNo = sc.next();
    int sum = FindSum(cardNo);

    if ((sum % 10) == 0) {
        System.out.println("The card number is VALID.");
    } else {
        System.out.println("The card number is INVALID");
    }

}

public static int FindSum(String cardNo) {

    //CONVERTING CARD NUMBER INTO AN ARRAY
    int[] digits = new int[cardNo.length()];
    for (int i = 0; i < cardNo.length(); i++) {
        digits[i] = Character.getNumericValue(cardNo.charAt(i));
    }

    //DOUBLE EVERY OTHER NUMBER FROM RIGHT TO LEFT
    for (int i = digits.length - 1; i >= 0; i -= 2) {

        digits[i] += digits[i];

        if (digits[i] > 9) {
            digits[i] = digits[i] - 9;
        }
    }
    int sum = 0;
    for (int i = 0; i < digits.length; i++) {
        sum += digits[i];
    }

    sum *= 9;
    return sum;

}

}
公共类信用卡检查器{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
扫描仪sc=新的扫描仪(System.in);
System.out.println(“输入信用卡号以检查有效性:”);
System.out.println();
字符串cardNo=sc.next();
int sum=FindSum(cardNo);
如果((总和%10)==0){
System.out.println(“卡号有效”);
}否则{
System.out.println(“卡号无效”);
}
}
公共静态int FindSum(字符串cardNo){
//将卡号转换为数组
int[]位=新的int[cardNo.length()];
对于(int i=0;i=0;i-=2){
数字[i]+=数字[i];
如果(数字[i]>9){
数字[i]=数字[i]-9;
}
}
整数和=0;
对于(int i=0;i
执行该步骤时出现错误:

第1步:从右到左每秒钟两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字

您可以从信用卡号的最后(n)位开始迭代,而应该从第(n-1)位开始。即改变:

for (int i = digits.length - 1; i >= 0; i -= 2)


另外,请记住,您的
FindSum(String cardNo)
方法仅适用于
String
s,其中没有空格(这是您获取输入的方式)。

当您运行代码并键入数字时,
cardNo
的值是多少?如果您将其打印到控制台,它会显示什么?您需要忽略原始卡号的最右边数字。该数字是校验和数字,在计算Luhn校验和时不应包括在内。@csmckelvey我试图将其打印到控制台,但没有显示任何内容up@Bobulous在给出的示例中,他们在总和中使用了卡的所有16位数字,这难道不意味着我不会忽略它吗?我想你是在使用换行符作为输入,不是号码。我更正了这一部分,但它仍然告诉我有效的卡号无效。@WilliamLoveless我刚刚用互联网上的一些例子和我自己的信用卡检查了一下,效果很好。你能给我举个不适合你的数字的例子吗?别担心,我在做这些改变的时候把一些小事情弄糟了。你说得对。
for (int i = digits.length - 2; i >= 0; i -= 2)