java身份证验证代码实现

下面是 “java身份证验证代码实现”的完整攻略。

1. 身份证号码规则

身份证号码规则如下:

  • 身份证号码为18位数字和字母(除最后一位是字母外)
  • 前17位为地区码和出生日期码,最后一位为校验码
  • 校验码计算方法:
  • 取出前17位数字(地区码和出生日期码),按权重分别乘以7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2
  • 对乘积求和
  • 将和数除以11,得到余数(可能为0~10)
  • 余数0~9直接作为校验码,余数10用字母X表示

2. Java实现身份证验证代码

在 Java 中实现身份证验证,需要借助正则表达式和日期格式化,实现代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IdCardUtils {

    // 18位身份证正则表达式
    private static final String ID_CARD_REGEXP = "^\\d{17}(\\d|X)$";

    /**
     * 验证身份证号码是否合法
     *
     * @param idCard 身份证号码
     * @return 是否合法
     */
    public static boolean isValid(String idCard) {
        // 验证格式是否正确
        if (!Pattern.matches(ID_CARD_REGEXP, idCard)) {
            return false;
        }

        // 验证校验码是否正确
        int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        String[] codeArr = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += (idCard.charAt(i) - '0') * weight[i];
        }
        String code = codeArr[sum % 11];
        return code.equals(idCard.substring(17));
    }

    /**
     * 获取身份证号码中的出生日期
     *
     * @param idCard 身份证号码
     * @return 出生日期(字符串形式)
     * @throws ParseException 解析异常
     */
    public static String getBirthday(String idCard) throws ParseException {
        String birthdayStr = idCard.substring(6, 14);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(birthdayStr));
        return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
    }

    // 测试
    public static void main(String[] args) throws ParseException {
        String idCard1 = "110101199003076810";
        String idCard2 = "11010119900307681X";
        System.out.println(idCard1 + " 是否合法:" + isValid(idCard1));
        System.out.println(idCard2 + " 是否合法:" + isValid(idCard2));
        System.out.println(idCard1 + " 出生日期:" + getBirthday(idCard1));
        System.out.println(idCard2 + " 出生日期:" + getBirthday(idCard2));
    }
}

运行上面的测试代码,可以得到以下输出:

110101199003076810 是否合法:true
11010119900307681X 是否合法:true
110101199003076810 出生日期:1990-03-07
11010119900307681X 出生日期:1990-03-07

3. 示例说明

在实际开发中,可以应用身份证验证代码来验证用户输入的身份证号码是否符合规范,例如:

示例 1:用户在注册页面填写个人信息,其中需要填写身份证号码,那么就可以在提交表单时,调用身份证验证代码,对用户输入的身份证号码进行验证。如果不符合规范,提示用户重新填写。如果符合规范,可以计算出用户的出生日期等信息,方便后续使用。

示例 2:后台管理系统中,可以将用户身份证号码保存到数据库中,并提供身份证号码查询功能。此时,可以在查询操作时,调用身份证验证代码,对用户输入的身份证号码进行验证,保证查询条件的合法性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java身份证验证代码实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java实战之实现在线小说阅读系统

    Java实战之实现在线小说阅读系统攻略 项目简介 本项目是一个在线小说阅读系统,可以实现用户注册登录、搜索小说、在线阅读等功能。该项目使用 Java 语言作为主要开发语言,并使用 Maven 进行项目构建和管理,使用 Spring Boot 框架搭建后端服务,使用 Thymeleaf 模板引擎进行页面渲染,使用 Bootstrap 框架进行前端页面布局。 开…

    Java 2023年5月19日
    00
  • Nginx的伪静态配置中使用rewrite来实现自动补全的实例

    以下是详细的攻略: 什么是Nginx伪静态配置? Nginx伪静态配置又叫做URL重写,可以通过对URL的转换来实现对客户端的透明隐藏,防止暴露后端服务器的真实地址。通常情况下,我们使用rewrite指令来实现伪静态配置。 如何使用rewrite实现URL自动补全? 对于URL自动补全实现,我们可以使用rewrite来将用户输入的不完整URL进行自动补全,以…

    Java 2023年6月15日
    00
  • Java之Arrays的各种功能和用法总结

    Java之Arrays的各种功能和用法总结 简介 Java中的Arrays类提供了一组用于操作数组的静态方法。Arrays类中的方法支持对数组的排序、搜索、比较、填充和转换等操作,该类还提供了一个asList()方法来创建一个ArrayList. 方法列表 下面是Arrays类中一些常用方法的列表: 方法 描述 sort() 对数组进行排序。 binaryS…

    Java 2023年5月26日
    00
  • Java开发工具IntelliJ IDEA安装图解

    下面我来给你详细讲解“Java开发工具IntelliJ IDEA安装图解”的完整攻略。 准备工作 在安装IntelliJ IDEA之前,我们需要先准备好Java环境。具体步骤如下: 1.下载并安装JDK。在官网下载 JDK,根据自己电脑的操作系统选择下载对应版本的JDK,并安装到默认路径下。 2.配置环境变量。将JDK的安装路径添加到系统环境变量中,具体步骤…

    Java 2023年5月26日
    00
  • SpringBoot Security的自定义异常处理

    我来为您讲解如何在SpringBoot Security中进行自定义异常处理。 1. 异常处理 SpringBoot Security框架中,可以使用@ControllerAdvice和@ExceptionHandler来实现对自定义异常的处理。 1.1 定义自定义异常 首先,我们需要定义一个自定义异常类,例如: (1)自定义异常类MyException.j…

    Java 2023年5月20日
    00
  • 浅谈Java8新特性Predicate接口

    浅谈Java8新特性Predicate接口 Java 8中新增加了Predicate接口,它定义了一个输入参数和返回值都为Boolean的函数。这个接口定义了许多实用的方法,可以被用来组合复杂的布尔逻辑。 Predicate接口定义 Predicate接口有一个test方法,返回一个Boolean类型,其定义如下: @FunctionalInterface …

    Java 2023年5月26日
    00
  • environments was not found on the java.library.path 问题的解决方法

    问题背景: 当在Java程序中调用JNI(Java Native Interface)代码或使用一些依赖本地库的第三方库时,可能会出现“environments was not found on the java.library.path”错误。这是因为JVM无法找到必要的库或库文件路径,导致没有正确初始化本地环境。 解决方法: 一般情况下,要解决这个问题,…

    Java 2023年5月19日
    00
  • SpringBoot详解如果通过@Value注解给静态变量注入值

    下面为您详细讲解“Spring Boot通过@Value注解给静态变量注入值”的攻略。 背景介绍 在Spring Boot开发中,我们通常使用@ConfigurationProperties注解来为Java Bean注入外部配置属性。但是,如果我们需要为静态变量注入外部属性,就需要使用@Value注解。 示例 示例1:注入基本数据类型 首先,让我们看一个简单…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部