zoukankan      html  css  js  c++  java
  • 生成仿信用卡的卡号

    package com.shopping.test;
    
    import java.util.List;
    import java.util.Stack;
    import java.util.Vector;
    
    /**
     * 随机生成仿信用卡的会员号
     * 20190819
     */
    public class RandomCreditCardNumberGenerator {
    
        public static final String[] VISA_PREFIX_LIST = new String[]{"4539",
                "4556", "4916", "4532", "4929", "40240071", "4485", "4716", "4"};
    
        public static final String[] MASTERCARD_PREFIX_LIST = new String[]{"51",
                "52", "53", "54", "55"};
    
        public static final String[] AMEX_PREFIX_LIST = new String[]{"34", "37"};
    
        public static final String[] DISCOVER_PREFIX_LIST = new String[]{"6011"};
    
        public static final String[] DINERS_PREFIX_LIST = new String[]{"300",
                "301", "302", "303", "36", "38"};
    
        public static final String[] ENROUTE_PREFIX_LIST = new String[]{"2014",
                "2149"};
    
        public static final String[] JCB_PREFIX_LIST = new String[]{"35"};
    
        public static final String[] VOYAGER_PREFIX_LIST = new String[]{"8699"};
    
        static String strrev(String str) {
            if (str == null)
                return "";
            String revstr = "";
            for (int i = str.length() - 1; i >= 0; i--) {
                revstr += str.charAt(i);
            }
    
            return revstr;
        }
    
    
        /**
         * 生成卡号
         * @param prefix 前缀
         * @param length 卡号长度 13或者16位
         */
        static String completed_number(String prefix, int length) {
    
            String ccnumber = prefix;
            while (ccnumber.length() < (length - 1)) {
                ccnumber += new Double(Math.floor(Math.random() * 10)).intValue();
            }
            String reversedCCnumberString = strrev(ccnumber);
            List<Integer> reversedCCnumberList = new Vector<Integer>();
            for (int i = 0; i < reversedCCnumberString.length(); i++) {
                reversedCCnumberList.add(new Integer(String.valueOf(reversedCCnumberString.charAt(i))));
            }
    
            int sum = 0;
            int pos = 0;
    
            Integer[] reversedCCnumber = reversedCCnumberList
                    .toArray(new Integer[reversedCCnumberList.size()]);
            while (pos < length - 1) {
                int odd = reversedCCnumber[pos] * 2;
                if (odd > 9) {
                    odd -= 9;
                }
                sum += odd;
                if (pos != (length - 2)) {
                    sum += reversedCCnumber[pos + 1];
                }
                pos += 2;
            }
    
            int checkdigit = new Double(
                    ((Math.floor(sum / 10) + 1) * 10 - sum) % 10).intValue();
            ccnumber += checkdigit;
    
            return ccnumber;
        }
    
        /**
         * 信用卡号码
         * @param prefixList 前缀的数组
         * @param length 长度
         * @param howMany 数量
         * @return
         */
        public static String[] credit_card_number(String[] prefixList, int length, int howMany) {
            Stack<String> result = new Stack<String>();
            for (int i = 0; i < howMany; i++) {
                int randomArrayIndex = (int) Math.floor(Math.random() * prefixList.length);
                String ccnumber = prefixList[randomArrayIndex];
                result.push(completed_number(ccnumber, length));
            }
    
            return result.toArray(new String[result.size()]);
        }
    
    
        /**
         * 生成一个卡号的数组
         * @param howMany 卡号的数量
         * @return String[] 数组
         */
        public static String[] generateMasterCardNumbers(int howMany) {
            return credit_card_number(MASTERCARD_PREFIX_LIST, 16, howMany);
        }
    
        public static String generateMasterCardNumber() {
            return credit_card_number(MASTERCARD_PREFIX_LIST, 16, 1)[0];
        }
    
        public static boolean isValidCreditCardNumber(String creditCardNumber) {
            boolean isValid = false;
    
            try {
                String reversedNumber = new StringBuffer(creditCardNumber).reverse().toString();
                int mod10Count = 0;
                for (int i = 0; i < reversedNumber.length(); i++) {
                    int augend = Integer.parseInt(String.valueOf(reversedNumber
                            .charAt(i)));
                    if (((i + 1) % 2) == 0) {
                        String productString = String.valueOf(augend * 2);
                        augend = 0;
                        for (int j = 0; j < productString.length(); j++) {
                            augend += Integer.parseInt(String.valueOf(productString.charAt(j)));
                        }
                    }
    
                    mod10Count += augend;
                }
    
                if ((mod10Count % 10) == 0) {
                    isValid = true;
                }
            } catch (NumberFormatException e) {
            }
    
            return isValid;
        }
    
        public static void main(String[] args) {
            int howMany = 500;
            String[] creditcardnumbers = generateMasterCardNumbers(howMany);
            for (int i = 0; i < creditcardnumbers.length; i++) {
                System.out.println(creditcardnumbers[i]);
            }
        }
    }
  • 相关阅读:
    Linux scp、ssh命令
    Linux ps、top、free、uname命令
    适配器模式
    Linux不能进入图形化界面运行yum不管用
    SpringMVC 测试 mockMVC
    Idea和Git集成,并且Git管理不同的秘钥,idea分别提交项目到GitLab和GitHub
    多线程
    Java中Volatile关键字详解
    Spring事务管理--(二)嵌套事物详解
    jConsole, jVisualvm, btrace 区别和联系
  • 原文地址:https://www.cnblogs.com/wyf-love-dch/p/11379505.html
Copyright © 2011-2022 走看看