【问题标题】:Java: How to check a Credit Cards validity using the Luhn check and using MethodsJava:如何使用 Luhn 检查和使用方法检查信用卡的有效性
【发布时间】:2020-02-28 07:01:08
【问题描述】:

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

这是 Luhns 检查:

信用卡号必须包含 13 到 16 位数字。它必须以: ■ Visa卡4张 ■ 主卡5张 ■ 美国运通卡37 ■ 6 用于发现卡

  1. 从右到左每隔一个数字加一次。如果一位数加倍得到两位数,则将两位数相加得到一位数。
  2. 现在添加步骤 a 中的所有个位数。
  3. 将卡号从右到左奇数位的所有数字相加。
  4. 将步骤 b 和步骤 c 的结果相加。
  5. 如果步骤d的结果能被10整除,则卡号有效;否则无效。例如号码 4388576018402626 无效,但号码 4388576018410707 有效。

我的问题是我仍在学习方法(完全是初学者。我去年曾尝试学习编码并放弃了,但这次我设法做到了这一点)我不知道如何使用这些方法来执行 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();
}

【问题讨论】:

标签: java methods luhn


【解决方案1】:

对您的代码的评论:

  • Java 命名约定是方法名称以小写字母开头,例如您的 isValid 方法。

  • doubleToSingle方法中,xint10int字面量,所以x / 10int,结果被截断表示不需要此演员表:(int)(x / 10)

  • 由于doubleToSingle方法可以处理一位数字,所以调用者(doubling方法)也不需要处理,所以去掉if (parse &gt; 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
    

    doubling 方法从 last 索引开始,而不是它应该的倒数第二个索引,它跳过了它不应该的 first 索引。循环应该是:

    for (int index = s.length() - 2; index >= 0; index -= 2)
    
  • doubling 方法确实需要在调用 doubleToSingle 方法之前将数字 (parse * 2) 实际加倍

  • oddDigits 方法从 left 计数奇数/偶数,而它应该从 right 计数。

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

    for (int index = s.length() - 1; index >= 0; index -= 2)
    
  • doublingoddDigits方法应该returnsum,否则有什么意义?

如果您认为 doublingoddDigits 方法缺少返回值是让您陷入困境的原因,那么我会让您从这里开始处理其余代码。


虽然下面的代码超出了你目前的技能水平,但我想展示它,让你有一些期待,能够理解并最终编写出类似的代码。

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(...) 正则表达式。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2021-07-21
    • 2014-12-25
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2015-04-30
    • 2011-01-10
    • 2018-12-23
    相关资源
    最近更新 更多