当前位置: 首页 > 知识库问答 >
问题:

Java:如何使用Luhn检查和使用方法检查信用卡的有效性

雷国兴
2023-03-14

我一直试图弄清楚这种Luhns的方法来验证信用卡,但我似乎无法弄清楚。我需要使用方法,而不能使用数组,所以我完全被难住了。

    null

我的问题是,我仍然在学习方法(完全是初学者。去年我试着学过一次代码,但放弃了,但这次我设法做到了这一点),我不知道如何使用这些方法来完成Luhn检查中的第4步和第5步。

谁能帮我一下吗?谢谢!!

public static boolean isValid(String x) {
    return false; // Stub method    
}

public static void AddResults() {

}

public static void OddDigits(String s) {
    int sum = 0;
    for (int index = 0; index < s.length(); index ++) {
        if (index % 2 != 0) {
            sum = sum + Character.getNumericValue(s.charAt(index));
        }
    }
    return;
}

public static int DoubleToSingle(int x) { // Adds up the digits in a two-digit number. 
    if (x < 10) {
        return x;
    } 
    else {
        int firstDigit = x % 10;
        int secondDigit = (int)(x / 10);
        return firstDigit + secondDigit;
    }
}

public static void Doubling(String s) {
    int sum = 0;
    for (int index = s.length() - 1; index > 0; index-= 2) {
        int parse = Character.getNumericValue(s.charAt(index));
        if (parse > 9) {
        sum = sum + DoubleToSingle(parse);
        }
        else {
            sum = sum + parse;
        }
    }

    return;
}

public static boolean CheckLength(String s) {
    if (s.length() < 13 || s.length() > 16) { // If the cc number is smaller than 13 digits or larger than 16 digits, it's invalid
        return false;
    }
    else {
        return true;
    }
}

public static String ReadString(Scanner s) { // Creating a string method. (Using it to practice creating methods)
    String x = s.nextLine();
    return x;
}

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please input a valid Credit Card number: ");
    String CC = ReadString(input);

    if (isValid(CC) == true) {
        System.out.println(CC + " is valid.");
    } else {
        System.out.println(CC + " is invalid.");
    }       
    input.close();
}

共有1个答案

高兴贤
2023-03-14

关于代码的注释:

>

  • Java命名约定是方法名称以小写字母开头,就像您的isvalid方法一样。

    DoubleToSingle方法中,xint10int,因此x/10将是int,结果被截断,这意味着不需要进行这种强制转换:(int)(x/10)

    由于doubletoSingle方法可以处理个位数,因此调用方(doubling方法)也不需要处理它,因此取消if(parse>9)测试。

    从右边开始计算数字是这样的:

     5th digit       Odd places:
     ↓ 3rd digit       Don't double these digits, just sum them
     ↓ ↓ 1st digit
     ↓ ↓ ↓
    999999
    ↑ ↑ ↑
    ↑ ↑ 2nd digit    Even places, aka "every second digit from right":
    ↑ 4th digit        Double these digits, combine digits when
    6th digit          two-digit number, then sum them
    

    加倍方法从最后一个索引开始,而不是从第二个索引开始,它跳过了第一个索引,而这是不应该的。循环应该是:

    for (int index = s.length() - 2; index >= 0; index -= 2)
    

    在调用DoubleTosing方法之前,DoubleTosing方法确实需要将数字加倍(Parse*2)。

    odddigits方法从左数奇数/偶数,而它应该从右数。

    删除if(索引%2!=0)测试,并使用与doubling方法中类似的循环:

    for (int index = s.length() - 1; index >= 0; index -= 2)
    

    虽然下面的代码超出了您当前的技能水平,但我想展示它,这样您就可以期待一些东西,能够理解并最终编写类似的代码。

    public static boolean isValid(String cc) {
        if (! cc.matches("(?=[456]|37)[0-9]{13,16}"))
            return false;
        int sum = 0;
        for (int i = cc.length() - 1, pos = 1; i >= 0; i--, pos++) {
            int digit = cc.charAt(i) - '0';
            sum += (pos % 2 == 1/*odd*/ ? digit : digit < 5 ? digit * 2 : digit * 2 - 9);
        }
        return (sum % 10 == 0);
    }
    

    它测试问题中列出的所有条件,甚至是你还没有开始的“它必须从”部分。在您的技能水平上,您可能应该使用s.startswith(“xx”)而不是这里使用的matches(...)正则表达式

  •  类似资料:
    • 我尝试使用Luhn算法检查信用卡的验证,该算法的工作步骤如下: 2*2=4 4*2=8 1*2=2 4*2=8 现在将步骤1中的所有个位数相加。 4+4+8+2+3+1+7+8=37 简单地说,我的程序总是对我输入的所有内容显示有效。即使它是一个有效的数字并且sumOfOddPlace和sumOfDoubleEvenPlace方法的结果等于零。 不胜感激。

    • 我试图用JAVA开发一个应用程序,它将检查用户输入的信用卡号是否有效。 下面是检查模数10的步骤: 步骤1:从右到左每秒数字加倍。如果一个数字的倍增导致一个两位数,则将这两个数字相加得到一个个位数。 步骤4:求和步骤2和步骤3的结果 步骤5:如果步骤4的结果可被10整除,则卡号有效;否则无效。在这种情况下,卡号无效--因为75不能被10整除。 到目前为止,我的问题是,我尝试的每一个卡号(使用有效的

    • 问题内容: 我对angularjs很陌生。说我的应用程式有表格。使用检查器,我注意到,如果angularjs认为该表单无效,则会向该表单添加ng- invalid类。可爱。 因此,似乎为了检查表单是否有效,我需要使用Jquery选择器来污染我的代码吗?不使用表单控制器来指示表单有效性的angularjs方法是什么? 问题答案: 当您将标签放入ngApp时,AngularJS会自动添加表单控制器(实

    • Luhn 算法 的实现,用来验证各种识别码,如信用卡号码,IMEI码,国家提供商标识符号码等。 使用 String.split('') ,Array.reverse() 和 Array.map() 结合 parseInt() 得到一个数字数组。 使用 Array.splice(0,1) 获取最后一位数字。 使用 Array.reduce() 来实现 Luhn 算法。 如果 sum 能被 10 整除

    • 这里是错误: 为什么字母*不匹配任何东西??

    • 问题内容: 我有方法必须检查JSON是否有效,该方法在如何检查给定字符串在Java中是否为有效JSON上找到,但是它不起作用。 如果我将此方法与某些字符串一起使用,它将始终返回true。例如: 它给了我, 也给了我 问题答案: 根据如何检查给定字符串在Java中是否为有效JSON,我找到了解决方案但使用库 现在,随机查找的字符串是并且为真。