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

Java:如何使用Luhn check和using方法检查信用卡的有效性,java,methods,luhn,Java,Methods,Luhn,我一直在试图找出Luhns验证信用卡的方法,但我似乎无法找到它。我需要使用方法,不能使用数组,所以我完全被难住了 这是卢恩的支票: 信用卡号必须在13到16位之间。它必须从以下方面开始: ■ 4.Visa卡 ■ 5张万事达卡 ■ 37张美国运通卡 ■ 6用于发现卡 从右到左每隔两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字 现在将步骤a中的所有单个数字相加 在卡号中从右到左的奇数处添加所有数字 将步骤b和步骤c的结果相加 如果步骤d的结果可被10整除,则卡号有

我一直在试图找出Luhns验证信用卡的方法,但我似乎无法找到它。我需要使用方法,不能使用数组,所以我完全被难住了

这是卢恩的支票:

信用卡号必须在13到16位之间。它必须从以下方面开始: ■ 4.Visa卡 ■ 5张万事达卡 ■ 37张美国运通卡 ■ 6用于发现卡

  • 从右到左每隔两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字
  • 现在将步骤a中的所有单个数字相加
  • 在卡号中从右到左的奇数处添加所有数字
  • 将步骤b和步骤c的结果相加
  • 如果步骤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();
    }
    
    公共静态布尔值有效(字符串x){
    返回false;//存根方法
    }
    公共静态void AddResults(){
    }
    公共静态无效数字(字符串s){
    整数和=0;
    对于(int index=0;index0;index-=2){
    int parse=Character.getNumericValue(s.charAt(index));
    如果(解析>9){
    sum=sum+DoubleToSingle(解析);
    }
    否则{
    sum=sum+parse;
    }
    }
    回来
    }
    公共静态布尔校验长度(字符串s){
    如果(s.length()<13 | | s.length()>16){//如果cc数小于13位或大于16位,则它无效
    返回false;
    }
    否则{
    返回true;
    }
    }
    publicstaticstringreadstring(scanners){//创建一个String方法。(使用它来练习创建方法)
    字符串x=s.nextLine();
    返回x;
    }
    公共静态void main(字符串[]args){
    扫描仪输入=新扫描仪(System.in);
    System.out.println(“请输入有效的信用卡号:”);
    字符串CC=读取字符串(输入);
    如果(isValid(CC)=真){
    System.out.println(CC+“有效”);
    }否则{
    System.out.println(CC+“无效”);
    }       
    input.close();
    }
    
    关于您的代码的评论:

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

    • doubleToSingle
      方法中,
      x
      是一个
      int
      10
      是一个
      int
      文本,因此
      x/10
      将是一个
      int
      ,结果将被截断,这意味着不需要进行此转换:
      (int)(x/10)

    • 由于
      double-tosingle
      方法可以处理一位数,因此调用方(
      double
      方法)也不需要处理它,因此消除
      if(parse>9)
      测试

    • 从右侧开始计算数字的工作原理如下:

      5位奇数位:
      ↓ 第三位数不要把这些数字翻两倍,只要把它们加起来就行了
      ↓ ↓ 第一位
      ↓ ↓ ↓
      999999
      ↑ ↑ ↑
      ↑ ↑ 第二位偶数位,也称为“右起每第二位”:
      ↑ 第四位是这些数字的两倍,在
      第六位两位数,然后求和
      
      doubling
      方法从最后一个索引开始,而不是应该从第二个索引开始,它跳过了不应该从第一个索引开始的索引。循环应为:

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

    • odddights
      方法从左侧计数奇数/偶数,而它应该从右侧计数

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

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

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


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

    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);
    }
    
    公共静态布尔值有效(字符串cc){
    如果(!cc.matches((?=[456]| 37)[0-9]{13,16}”))
    返回false;
    整数和=0;
    对于(int i=cc.length()-1,pos=1;i>=0;i--,pos++){
    整数位数=抄送字符(i)-“0”;
    总和+=(位置%2==1/*奇数*/?位数:位数<5?位数*2:位数*2-9);
    }
    返回(总和%10==0);
    }
    
    它测试问题中列出的所有条件,甚至是您尚未开始的“必须从”部分。在您的技能水平上,您可能应该使用
    s.startsWith(“xx”)
    而不是此处使用的
    匹配(…)
    正则表达式