根据身份证号判断证件持有人的性别、年龄、生日。废话不多说,直接上代码。
public class IdentifyCard {
private static final Integer[] ODD_NUMS = {1, 3, 5, 7, 9};
private static final Integer[] EVEN_NUMS = {0, 2, 4, 6, 8};
private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_THREAD_LOCAL =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd"));
/**
* @param area 地区码,如:110101
* @param birthday 出生日期:20000101
* @param sex 性别:0=男;1=女
* @param size 最小1;最大500
* @return results 生成结果集
*/
public static String[] generator(String area, Date birthday, int sex, int size) {
SexEnum.checkSex(sex);
checkSize(size);
List<String> resultList = new ArrayList<>(size);
String simpleBirthday = DATE_FORMAT_THREAD_LOCAL.get().format(birthday);
Set<String> numbers = ordinalNumbers(sex, size);
for (String seqNo : numbers) {
String prefix = area + simpleBirthday + seqNo;
String cardNo = prefix + getCheckCode(prefix);
resultList.add(cardNo);
}
String[] results = resultList.toArray(new String[size]);
new RandomSort<String>(results).changePosition();
return results;
}
private static void checkSize(int size) {
if (size < 1 || size > 500) {
throw new IllegalArgumentException("The size min 1, max 500.");
}
}
// prefix = area + birthdayFormat + seqNo
private static String getCheckCode(String prefix) {
int sum = 0;
for (int i = 0; i < prefix.length(); i++) {

最低0.47元/天 解锁文章
3874

被折叠的 条评论
为什么被折叠?



