信用卡类型和验证

 孙倩倩猫小窝W_199 发布于 2023-02-12 20:21

我想运行一个程序,可以根据输入的数字确定信用卡号的验证和类型.编译器显示我的编码中有错误的通知,但我无法检测它在哪里.该程序也无法运行.下面是编码,

    import java.util.*;

    public class CreditCard {

        public static void main(String args[]) {
                String CType;(String number) {
                    if (number.startsWith("4"))
                        return "Visa";
                    else if (number.startsWith("5"))
                        return "MasterCard";
                    else if (number.startsWith("6"))
                        return "Discover";
                    else if (number.startsWith("37"))
                        return "American Express";
                    else
                        return "Unknown type";
                };
            Scanner input = new Scanner(System.in);

            System.out.println("Enter a credit card number: ");
            long number = input.nextLong();

            long total = sumOfEvenPlaces(number) + (sumOfOddPlaces(number)*2);

            if (isValid(total)) {
                System.out.println("The "+CType+" card number is valid");
            } else {
                System.out.println("The "+CType+" card number is invalid.");
            }
        }



        public static boolean isValid(long total) {
            if (total % 10 != 0) {
            } else {
                        return true;
                }
            return false;
        }

        public static int sumOfEvenPlaces(long number) {
            int sum = 0;
            int remainder;
            while (number % 10 != 0 || number / 10 != 0) {
                remainder = (int) (number % 10);

                sum = sum + getDigit(remainder * 2);
                number /= 100;
            }
            return sum;
        }

        public static int getDigit(int number) {
            if (number > 9) {
                return (number % 10 + number / 10);
            } 
            return number;
        }

        public static int sumOfOddPlaces(long number) {
            int sum = 0;
            int remainder;
            number /= 10;
            while (number % 10 != 0 || number / 10 != 0) {
                remainder = (int) (number % 10);
                sum = sum + getDigit(remainder * 2);
                number /= 100;
            }
            return sum;
        }
    }

Gabriel Baum.. 29

我用枚举进行卡片类型检测:

package com.gabrielbauman.gist;

import java.util.regex.Pattern;

public enum CardType {

    UNKNOWN,
    VISA("^4[0-9]{12}(?:[0-9]{3}){0,2}$"),
    MASTERCARD("^(?:5[1-5]|2(?!2([01]|20)|7(2[1-9]|3))[2-7])\\d{14}$"),
    AMERICAN_EXPRESS("^3[47][0-9]{13}$"),
    DINERS_CLUB("^3(?:0[0-5]\\d|095|6\\d{0,2}|[89]\\d{2})\\d{12,15}$"),
    DISCOVER("^6(?:011|[45][0-9]{2})[0-9]{12}$"),
    JCB("^(?:2131|1800|35\\d{3})\\d{11}$"),
    CHINA_UNION_PAY("^62[0-9]{14,17}$");

    private Pattern pattern;

    CardType() {
        this.pattern = null;
    }

    CardType(String pattern) {
        this.pattern = Pattern.compile(pattern);
    }

    public static CardType detect(String cardNumber) {

        for (CardType cardType : CardType.values()) {
            if (null == cardType.pattern) continue;
            if (cardType.pattern.matcher(cardNumber).matches()) return cardType;
        }

        return UNKNOWN;
    }

}

然后你可以做CardType.detect("cardnumbergoeshere"),你会得到CardType.VISA等.

在要点上有一个单元测试.

为了验证,我有:

public boolean isValid(String cardNumber) {
    int sum = 0;
    boolean alternate = false;
    for (int i = cardNumber.length() - 1; i >= 0; i--) {
        int n = Integer.parseInt(cardNumber.substring(i, i + 1));
        if (alternate) {
            n *= 2;
            if (n > 9) {
                n = (n % 10) + 1;
            }
        }
        sum += n;
        alternate = !alternate;
    }
    return (sum % 10 == 0);
}

应该这样做.

编辑:修复DINERS_CLUB中的转义字符

1 个回答
  • 我用枚举进行卡片类型检测:

    package com.gabrielbauman.gist;
    
    import java.util.regex.Pattern;
    
    public enum CardType {
    
        UNKNOWN,
        VISA("^4[0-9]{12}(?:[0-9]{3}){0,2}$"),
        MASTERCARD("^(?:5[1-5]|2(?!2([01]|20)|7(2[1-9]|3))[2-7])\\d{14}$"),
        AMERICAN_EXPRESS("^3[47][0-9]{13}$"),
        DINERS_CLUB("^3(?:0[0-5]\\d|095|6\\d{0,2}|[89]\\d{2})\\d{12,15}$"),
        DISCOVER("^6(?:011|[45][0-9]{2})[0-9]{12}$"),
        JCB("^(?:2131|1800|35\\d{3})\\d{11}$"),
        CHINA_UNION_PAY("^62[0-9]{14,17}$");
    
        private Pattern pattern;
    
        CardType() {
            this.pattern = null;
        }
    
        CardType(String pattern) {
            this.pattern = Pattern.compile(pattern);
        }
    
        public static CardType detect(String cardNumber) {
    
            for (CardType cardType : CardType.values()) {
                if (null == cardType.pattern) continue;
                if (cardType.pattern.matcher(cardNumber).matches()) return cardType;
            }
    
            return UNKNOWN;
        }
    
    }
    

    然后你可以做CardType.detect("cardnumbergoeshere"),你会得到CardType.VISA等.

    在要点上有一个单元测试.

    为了验证,我有:

    public boolean isValid(String cardNumber) {
        int sum = 0;
        boolean alternate = false;
        for (int i = cardNumber.length() - 1; i >= 0; i--) {
            int n = Integer.parseInt(cardNumber.substring(i, i + 1));
            if (alternate) {
                n *= 2;
                if (n > 9) {
                    n = (n % 10) + 1;
                }
            }
            sum += n;
            alternate = !alternate;
        }
        return (sum % 10 == 0);
    }
    

    应该这样做.

    编辑:修复DINERS_CLUB中的转义字符

    2023-02-12 20:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有