如何用JAVA验证身份证号码有效性

发布时间:2022-08-26 15:09:59 作者:iii
来源:亿速云 阅读:142

如何用JAVA验证身份证号码有效性

目录

  1. 引言
  2. 身份证号码的结构
  3. 身份证号码的校验规则
  4. JAVA实现身份证号码验证
  5. 常见问题与解决方案
  6. 总结

引言

身份证号码是每个公民的唯一标识,广泛应用于各种场景中。为了确保身份证号码的有效性,我们需要对其进行验证。本文将详细介绍如何使用JAVA编程语言来验证身份证号码的有效性。

身份证号码的结构

18位身份证号码的结构

18位身份证号码由以下几部分组成:

  1. 地址码(前6位):表示公民常住户口所在县(市、旗、区)的行政区划代码。
  2. 出生日期码(第7到14位):表示公民的出生年月日,格式为YYYYMMDD。
  3. 顺序码(第15到17位):表示同一地址码下的不同公民,顺序码的奇数分配给男性,偶数分配给女性。
  4. 校验码(第18位):用于验证身份证号码的有效性。

15位身份证号码的结构

15位身份证号码由以下几部分组成:

  1. 地址码(前6位):表示公民常住户口所在县(市、旗、区)的行政区划代码。
  2. 出生日期码(第7到12位):表示公民的出生年月日,格式为YYMMDD。
  3. 顺序码(第13到15位):表示同一地址码下的不同公民,顺序码的奇数分配给男性,偶数分配给女性。

身份证号码的校验规则

18位身份证号码的校验规则

18位身份证号码的校验规则主要包括以下几个方面:

  1. 长度校验:身份证号码必须为18位。
  2. 地址码校验:前6位必须是有效的行政区划代码。
  3. 出生日期码校验:第7到14位必须是有效的日期格式。
  4. 顺序码校验:第15到17位必须是有效的顺序码。
  5. 校验码校验:第18位校验码必须符合校验规则。

15位身份证号码的校验规则

15位身份证号码的校验规则主要包括以下几个方面:

  1. 长度校验:身份证号码必须为15位。
  2. 地址码校验:前6位必须是有效的行政区划代码。
  3. 出生日期码校验:第7到12位必须是有效的日期格式。
  4. 顺序码校验:第13到15位必须是有效的顺序码。

JAVA实现身份证号码验证

18位身份证号码的验证

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

public class IDCardValidator {

    private static final Map<Integer, String> zoneNum = new HashMap<>();

    static {
        zoneNum.put(11, "北京");
        zoneNum.put(12, "天津");
        zoneNum.put(13, "河北");
        zoneNum.put(14, "山西");
        zoneNum.put(15, "内蒙古");
        zoneNum.put(21, "辽宁");
        zoneNum.put(22, "吉林");
        zoneNum.put(23, "黑龙江");
        zoneNum.put(31, "上海");
        zoneNum.put(32, "江苏");
        zoneNum.put(33, "浙江");
        zoneNum.put(34, "安徽");
        zoneNum.put(35, "福建");
        zoneNum.put(36, "江西");
        zoneNum.put(37, "山东");
        zoneNum.put(41, "河南");
        zoneNum.put(42, "湖北");
        zoneNum.put(43, "湖南");
        zoneNum.put(44, "广东");
        zoneNum.put(45, "广西");
        zoneNum.put(46, "海南");
        zoneNum.put(50, "重庆");
        zoneNum.put(51, "四川");
        zoneNum.put(52, "贵州");
        zoneNum.put(53, "云南");
        zoneNum.put(54, "西藏");
        zoneNum.put(61, "陕西");
        zoneNum.put(62, "甘肃");
        zoneNum.put(63, "青海");
        zoneNum.put(64, "宁夏");
        zoneNum.put(65, "新疆");
        zoneNum.put(71, "台湾");
        zoneNum.put(81, "香港");
        zoneNum.put(82, "澳门");
        zoneNum.put(91, "国外");
    }

    private static final int[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
    private static final int[] POWER_LIST = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

    public static boolean isValidIDCard(String idCard) {
        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
            return false;
        }
        if (idCard.length() == 15) {
            return validate15IDCard(idCard);
        }
        return validate18IDCard(idCard);
    }

    private static boolean validate18IDCard(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            return false;
        }
        String idCard17 = idCard.substring(0, 17);
        String idCard18Code = idCard.substring(17, 18);
        char[] c;
        String checkCode;
        if (isDigital(idCard17)) {
            c = idCard17.toCharArray();
        } else {
            return false;
        }

        int[] iCard = convertCharToInt(c);
        int iSum17 = getPowerSum(iCard);
        checkCode = getCheckCode18(iSum17);
        if (null == checkCode) {
            return false;
        }
        if (!idCard18Code.equalsIgnoreCase(checkCode)) {
            return false;
        }
        return true;
    }

    private static boolean validate15IDCard(String idCard) {
        if (idCard == null || idCard.length() != 15) {
            return false;
        }
        if (isDigital(idCard)) {
            String birthDay = idCard.substring(6, 12);
            Date birthDate = null;
            try {
                birthDate = new SimpleDateFormat("yyMMdd").parse(birthDay);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            Calendar cal = Calendar.getInstance();
            if (birthDate != null) {
                cal.setTime(birthDate);
            }
            return valiDate(cal.get(Calendar.YEAR), (cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));
        } else {
            return false;
        }
    }

    private static boolean isDigital(String str) {
        return str == null || "".equals(str) ? false : str.matches("^[0-9]*$");
    }

    private static int[] convertCharToInt(char[] ca) {
        int len = ca.length;
        int[] iArr = new int[len];
        try {
            for (int i = 0; i < len; i++) {
                iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return iArr;
    }

    private static int getPowerSum(int[] iArr) {
        int iSum = 0;
        if (POWER_LIST.length == iArr.length) {
            for (int i = 0; i < iArr.length; i++) {
                for (int j = 0; j < POWER_LIST.length; j++) {
                    if (i == j) {
                        iSum = iSum + iArr[i] * POWER_LIST[j];
                    }
                }
            }
        }
        return iSum;
    }

    private static String getCheckCode18(int iSum17) {
        switch (iSum17 % 11) {
            case 10:
                return "2";
            case 9:
                return "3";
            case 8:
                return "4";
            case 7:
                return "5";
            case 6:
                return "6";
            case 5:
                return "7";
            case 4:
                return "8";
            case 3:
                return "9";
            case 2:
                return "x";
            case 1:
                return "0";
            case 0:
                return "1";
            default:
                return null;
        }
    }

    private static boolean valiDate(int iYear, int iMonth, int iDay) {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int datePerMonth;
        if (iYear < 1900 || iYear >= year) {
            return false;
        }
        if (iMonth < 1 || iMonth > 12) {
            return false;
        }
        switch (iMonth) {
            case 4:
            case 6:
            case 9:
            case 11:
                datePerMonth = 30;
                break;
            case 2:
                boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0)) && (iYear > 1900 && iYear < year);
                datePerMonth = dm ? 29 : 28;
                break;
            default:
                datePerMonth = 31;
        }
        return (iDay >= 1) && (iDay <= datePerMonth);
    }
}

15位身份证号码的验证

public class IDCardValidator {

    // ... 其他代码 ...

    private static boolean validate15IDCard(String idCard) {
        if (idCard == null || idCard.length() != 15) {
            return false;
        }
        if (isDigital(idCard)) {
            String birthDay = idCard.substring(6, 12);
            Date birthDate = null;
            try {
                birthDate = new SimpleDateFormat("yyMMdd").parse(birthDay);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            Calendar cal = Calendar.getInstance();
            if (birthDate != null) {
                cal.setTime(birthDate);
            }
            return valiDate(cal.get(Calendar.YEAR), (cal.get(Calendar.MONTH) + 1), cal.get(Calendar.DAY_OF_MONTH));
        } else {
            return false;
        }
    }

    // ... 其他代码 ...
}

综合验证

public class IDCardValidator {

    // ... 其他代码 ...

    public static boolean isValidIDCard(String idCard) {
        if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
            return false;
        }
        if (idCard.length() == 15) {
            return validate15IDCard(idCard);
        }
        return validate18IDCard(idCard);
    }

    // ... 其他代码 ...
}

常见问题与解决方案

  1. 身份证号码长度不正确:确保输入的身份证号码长度为15位或18位。
  2. 身份证号码包含非数字字符:确保输入的身份证号码只包含数字字符。
  3. 出生日期无效:确保身份证号码中的出生日期是有效的日期格式。
  4. 校验码不正确:确保身份证号码的校验码符合校验规则。

总结

本文详细介绍了如何使用JAVA编程语言来验证身份证号码的有效性。通过理解身份证号码的结构和校验规则,我们可以编写出高效的验证代码。希望本文能帮助你在实际项目中更好地应用身份证号码验证技术。

推荐阅读:
  1. C#如何验证身份证号码
  2. c#如何批量抓取免费代理并且验证有效性

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:怎么用QT实现视频传输功能

下一篇:python yml文件读写与xml文件读写怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》