【Java】二代身份证号校验的工具类Java代码可直接使用

本文介绍了一个用于校验中国身份证号码合法性的Java工具类,包括校验身份证号码的格式、省份编码、出生日期及计算校验码等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是校验身份证合法性的工具类,需要的同学可以直接复制粘贴去用,没有其他依赖。

package com.gaby.commons.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
*@discrption:身份证
 * 计算公式:前17位的每个数字乘以自己对应的系数 所得之和除以11 查看余数 余数为指定数组的索引。 eg:如果余数是2 那么最后一位是X
 * 指定数组:[1 0 X 9 8 7 6 5 4 3 2]
*@user:Gaby
*@createTime:2019-07-08 15:15
*/
public class IdentityCardUtil {

    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    /**
     * 身份证前17位的系数  加权因子
     */
    private final static Integer[] QUOTIETY=new Integer[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    /**
     * 校验码
     */
    private final static String[] END_NUM = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};

    /**
     * 省市编码
     */
    public final static String[] provinceCode = new String[]{"11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"};

    /**
     * 校验合法性
     * @param idCard  18位身份证号
     * @return
     */
    public static boolean validate(String idCard) {
        boolean flag = false;
        if (idCard.length() != 18 ||!isNumeric(idCard.substring(0,17))||!isProvince(idCard.substring(0,2))||!isDate(idCard.substring(6,14))) {
            return false;
        }
        //拿到前17位
        String endNum = getEndNum(idCard.substring(0, 17));
        if (endNum.equals(idCard.substring(17).toUpperCase())) {
            flag = true;
        }
        return flag;
    }

    /**
     *  产生最后的校验码
     * @param idCard  前17位
     * @return
     */
    public static String getEndNum(String idCard) {
        //拿到17位
        char[] idCards = idCard.toCharArray();
        //总和
        int sum = 0;
        for (int i = 0; i <idCards.length; i++) {
            sum += Integer.parseInt(String.valueOf(idCards[i])) * QUOTIETY[i];
        }
        return END_NUM[sum % 11];
    }


    /**
     * 校验是否都是数字
     * @param cs
     * @return
     */
    public static boolean isNumeric(CharSequence cs) {
        if (isEmpty(cs)) {
            return false;
        } else {
            int sz = cs.length();

            for(int i = 0; i < sz; ++i) {
                if (!Character.isDigit(cs.charAt(i))) {
                    return false;
                }
            }

            return true;
        }
    }

    public static boolean isEmpty(CharSequence cs) {
        return cs == null || cs.length() == 0;
    }

    /**
     * 校验是否在省市编码中
     * @param province 身份证号的前2位
     * @return
     */
    public static boolean isProvince(String province) {
        for (String key : provinceCode) {
            if (key.equals(province)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 是否是男性
     * 此方法前提是调用了validate校验方法,因为只校验倒数第二位的奇偶
     * 奇数为男性 偶数为女性
     * @param province
     * @return
     */
    public static boolean isMale(String province){
        String sex = province.substring(province.length() - 2, province.length() - 1);
        return !(Integer.parseInt(sex) % 2 == 0);
    }

    /**
     * 校验 中间部分的出生时间是否合法
     * @param yyyyMMdd 年月日
     * @return
     */
    public static boolean isDate(String yyyyMMdd) {
        sdf.setLenient(false);
        try {
            sdf.parse(yyyyMMdd);
        } catch (ParseException e) {
            return false;
        }
        return true;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰肥啊

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值