All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.binarywang.tools.generator.BankCardNumberGenerator Maven / Gradle / Ivy

The newest version!
package cn.binarywang.tools.generator;

import java.util.Random;

import org.apache.commons.lang3.StringUtils;

import cn.binarywang.tools.generator.base.GenericGenerator;

/**
 * 效验是否为银行卡,用于验证
 * 现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的,
 * 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。
 * 16 位卡号校验位采用 Luhm 校验方法计算:
 * 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
 * 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
 * 3,将加法和加上校验位能被 10 整除。
 */
public class BankCardNumberGenerator extends GenericGenerator {
    private static GenericGenerator instance = new BankCardNumberGenerator();
    private BankCardNumberGenerator() {
    }

    public static GenericGenerator getInstance() {
        return instance;
    }

    @Override
    public String generate() {
        Random random = getRandomInstance();
//        ContiguousSet sets = ContiguousSet
//            .create(Range.closed(622126, 622925), DiscreteDomain.integers());
//        ImmutableList list = sets.asList();

        Integer prev = 622126 + random.nextInt(925 + 1 - 126);
        String bardNo = prev
            + StringUtils.leftPad(random.nextInt(999999999) + "", 9, "0");

        char[] chs = bardNo.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }

        char checkCode = luhmSum % 10 == 0 ? '0'
            : (char) (10 - luhmSum % 10 + '0');

        return bardNo + checkCode;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy