java 身份证号码验证

需要编号文件

编号文件部分内容如下

11:北京市
1101:市辖区
110101:东城区
110102:西城区
110105:朝阳区
110106:丰台区
110107:石景山区
110108:海淀区

......

编号文件内容比较多 csdn点击 下载地址

java代码如下 

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Consumer;
import java.util.regex.Pattern;
public class IdCardCheckUtils {public static final Integer[] idCardWeight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};//身份证前17位数字依次乘以对应的权重因子public static final String[] CONSTELLATION_ARR = {"水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "魔羯座"};//星座数组public static final int[] CONSTELLATION_EDGE_DAY = {20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22};//星座对应的边缘日期public static final String[] ZODIAC_ARR = {"猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"};//生肖public static Map<Integer, String> idCardMap = new HashMap<>();//组装根据余数,对应一个指定的校验码private static Map<Integer, String> nativePlaceCode = new HashMap<>(4096, 1);//内存籍贯编号,记录身份证编号对应的地址public static void main(String[] args) throws Exception {String path = "C:\\Users\\Administrator\\Desktop\\code.txt";//编号文件init(path);//初始化身份证校验参数String idCard = "512926164805034455";//测试的身份证号码checkIdCard(idCard);//校验身份证是否输入正常//基本信息System.out.println("出生日期:" + idCard.substring(6, 10) + "." + idCard.substring(10, 12) + "." + idCard.substring(12, 14));System.out.println("性别:" +getSex(idCard));System.out.println("年龄:" + getAge(idCard));System.out.println("您的星座:" + getConstellation(idCard));System.out.println("您的生肖:" + getAnimalSign(idCard));//籍贯信息int nativePlaceCode = Integer.parseInt(idCard.substring(0, 6));//籍贯组合编码int provinceCode = nativePlaceCode / 10000;//省编码int cityCode = nativePlaceCode / 100;//市编码int countyCode = nativePlaceCode;//县编码System.out.println(IdCardCheckUtils.nativePlaceCode.get(provinceCode));System.out.println(IdCardCheckUtils.nativePlaceCode.get(cityCode));System.out.println(IdCardCheckUtils.nativePlaceCode.get(countyCode));}/*** 初始化地区编码文件与校验码** @param path* @throws IOException*/private static void init(String path) throws IOException {synchronized (String.class) {if (!idCardMap.isEmpty()) return;Consumer<String> function = line -> {String[] split = line.split(":");nativePlaceCode.put(Integer.valueOf(split[0]), split[1]);};read(path, function);//将文件内容加载到map内存中final String[] idCardCheck = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};//身份证最后一位对应的校验码for (int i = 0; i < 10; i++) {idCardMap.put(i, idCardCheck[i]);//校验码记录}}}/*** 验证身份证号码是否正常** @param idCardNo* @return*/public static void checkIdCard(String idCardNo) throws Exception {String idCard = idCardNo.toUpperCase();//将其转成大写有的身份证最后一位是字母if (idCardNo.length() == 15) {//15位身份证转成18位if (!(idCardNo.matches("[0-9]{17}[0-9|x]|[0-9]{15}"))) throw new Exception("身份证号码输入错误,请输入正确格式的15位身份证号码");String s2 = idCardNo.substring(0, 6);//15位转换为18位String s3 = idCardNo.substring(6, 15);String changed = s2.concat("19").concat(s3);idCard = changed.toUpperCase();}if (!Pattern.matches("^\\d{17}", idCard.substring(0, 17))) throw new Exception("身份证号码输入错误,前17位必须是数字");//验证身份证前17位是否为数字char[] idCardCharNumber = idCard.toCharArray();Integer resultSum = 0;for (int i = 0; i < idCardCharNumber.length - 1; i++) resultSum += Character.getNumericValue(idCardCharNumber[i]) * idCardWeight[i];Integer lastResult = resultSum % 11;//将相加的前17位数字依次乘以对应的权重因子相加,相加的结果除以11,得到余数//根据余数,对应一个指定的校验码。最终得到的校验码就是身份证号码的最后一位数字。通过这个校验码,可以验证前面17位数字是否正确,从而提高身份证号码的准确性if (!(idCardMap.containsKey(lastResult)) || !(idCardMap.get(lastResult).equals(idCard.substring(idCard.length() - 1)))) throw new Exception("身份证号码校验异常,输入错误");}/*** 根据日期获取当前年龄** @return*/public static int getAge(String idCard) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");String dateString = dateFormat.format(new Date());int currentDate = Integer.parseInt(dateString);int idCardDate = Integer.parseInt(idCard.substring(6, 10) + idCard.substring(10, 12) + idCard.substring(12, 14));int age = (currentDate - idCardDate) / 10000;return age;}/*** 根据身份证id获取当前年龄** @return*/public static String getSex(String idCard) {String sex = Integer.parseInt(idCard.substring(16, 17)) % 2 == 0 ? "女" : "男";return sex;}/*** 根据身份证号判断用户星座** @param cardNo* @return*/public static String getConstellation(String cardNo) {String birthday = cardNo.substring(6, 14);// 获取出生日期Date birthdate = null;try {birthdate = new SimpleDateFormat("yyyyMMdd").parse(birthday);if (birthdate == null) return "";Calendar cal = Calendar.getInstance();cal.setTime(birthdate);int month = cal.get(Calendar.MONTH);int day = cal.get(Calendar.DAY_OF_MONTH);if (day < CONSTELLATION_EDGE_DAY[month]) month = month - 1;if (month >= 0) return CONSTELLATION_ARR[month];return CONSTELLATION_ARR[11];// default to return 魔羯} catch (ParseException e) {e.printStackTrace();}return null;}/*** 根据身份证号判断用户生肖** @param cardNo* @return*/public static String getAnimalSign(String cardNo) {String birthday = cardNo.substring(6, 14);// 获取出生日期Date birthdate;try {birthdate = new SimpleDateFormat("yyyyMMdd").parse(birthday);Calendar cal = Calendar.getInstance();cal.setTime(birthdate);return ZODIAC_ARR[cal.get(Calendar.YEAR) % 12];} catch (ParseException e) {e.printStackTrace();}return null;}public static void read(String path, Consumer<String> func) throws IOException {File file = new File(path);FileInputStream fileInputStream = null;InputStreamReader read = null;//考虑到编码格式BufferedReader bufferedReader = null;try {fileInputStream = new FileInputStream(file);read = new InputStreamReader(fileInputStream, "UTF-8");bufferedReader = new BufferedReader(read);String lineTxt;while ((lineTxt = bufferedReader.readLine()) != null) func.accept(lineTxt);//读取一行} catch (IOException e) {e.printStackTrace();} finally {bufferedReader.close();read.close();fileInputStream.close();}}
}

运行结果 ,身份证是随意编写的,可以用自己的身份证进行测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/130007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

github 创建自己的分支 并下载代码

github创建自己的分支 并下载代码 目录概述需求&#xff1a; 设计思路实现思路分析1.进入到master分支&#xff0c;git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候&#xff0c;会结构体里的字段边上加tag&#xff0c;有没有什么办法可以获取到这个tag的内容呢&#xff1f; 举例 tag信息可以通过反射&#xff08;reflect包&#xff09;内的方法获取&#xff0c;通过一个例子加深理解。 package mainimport (&quo…

Linux 6.6 初步支持AMD 新一代 Zen 5 处理器

AMD 下一代 Zen 5 CPU 现已开始为 Linux 6.6 支持提交相关代码&#xff0c;最新补丁包括提供温度监控和 EDAC 报告等。 最新的 Linux 6.6 代码中已经加入了包括支持硬件监视器温度监控和 EDAC 报告的补丁。此外&#xff0c;新版本还加入了 x86 / misc 补丁&#xff0c;Phoronix…

初出茅庐的小李博客之根据编译时间生成软件版本号

为什么要软件版本号呢&#xff1f; 生成软件版本号是在软件开发和维护过程中非常重要的一项任务&#xff0c;它有很多意义和好处&#xff0c;同时也有多种常见的方法。 标识和追踪&#xff1a;软件版本号是唯一的标识符&#xff0c;用于区分不同版本的软件。这有助于开发人员和…

华为云云服务器云耀L实例评测 | 华为云云服务器实例新品全面解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CATIA Composer软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 CATIA&#xff08;Computer-Aided Three-dimensional Interactive Application&#xff09;是一款由法国达索系统公司开发的三维计算机辅助设计&#xff08;CAD&#xff09;软件。它是一种全面的产品开发解决方案&#xff0c;广泛…

13-JVM调优实战-3

上一篇&#xff1a;12-JVM调优实战-2 今天来介绍一款阿里巴巴的调优工具。 Arthas详解 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6&#xff0c; 采用命令行交互模式&#xff0c;可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细&am…

约瑟夫环(循环列表实现)

约瑟夫&#xff08;Joseph&#xff09;问题的一种描述是&#xff1a;编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n的n个人按顺时针方向围坐一圈。每人持有一个密码&#xff08;正整数&#xff09;。一开始任选一个正整数作为报数上限值m&#xff0c;从第一个…

docker使用(二)提交到dockerhub springboot制作镜像

docker使用&#xff08;二&#xff09; dockerhub创建账号创建存储库成功&#xff01;开始推送获取image名 提交成功SpringBoot项目制作Dockerfile镜像部署打jar包 dockerhub创建账号 &#xff08;自认为可以理解为github一类的东西&#xff09; 单击创建存储库按钮。 设定存…

uniapp 小程序 全局弹窗 每个需要使用的页面都不用再引用

文章目录 创建组件在项目的根目录下的vue.config.vue中配置页面中使用 使用全局组件&#xff0c;先声明全局组件 与普通的组件声明不同之处在于 1&#xff1a;目录形式 2&#xff1a;声明引用方式 创建组件 在components目录中创建组件目录/组件vue&#xff0c;如下 注意需要同…

面向Ai设计的Mojo编程语言支持下载,当前只有Linux系统版本

据了解&#xff0c;Mojo是Modular AI公司开发的专门面向AI设计的编程语言&#xff0c;号称比Python快68000倍。 Mojo现已开放本地下载运行&#xff0c;除了编译器之外&#xff0c;Mojo SDK还包括一整套开发者和IDE工具&#xff0c;并用来构建和迭代 Mojo应用。 公司方面表示&…

二.RocketMQ基础概念及名词说明

RocketMQ基础概念及名词说明 一&#xff1a;RocketMQ基本概念1.消息&#xff08;Message&#xff09;2.生产者(Producer)3.消费者(Consumer)4.分组(Group)&#xff1a;4.主题&#xff08;Topic&#xff09;5.标签&#xff08;Tag&#xff09;6.队列&#xff08;Queue&#xff0…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的&#xff0c;跨平台的解决方案&#xff0c;记录&#xff0c;转换和流音频和视频。 官网&#xff1a;https://ffmpeg.org/ 二、安装 1、Linux&#xff1a; sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

Charles基础使用指南

##Charles 基本使用指南 Charles 在本地构建一个HTTP代理服务器&#xff0c;可以实现对HTTP、HTTPS请求的抓取&#xff0c;也就是我们常说的抓包&#xff0c;以及对请求响应的修改等。 Charles 官网地址 https://www.charlesproxy.com/ ###一、移动端的抓包实现 1. PC端开启…

C++重载输入和输出运算符

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 …

UIScrollView setContentOffset: animated:

项目中遇到感觉一切都设置对了&#xff0c;但是看到的效果和预想的不一样。 后来查询了一番&#xff0c;才知道问题所在&#xff0c;现在记录一下&#xff0c;担心过后又忘了。 最初的问题是这样的&#xff0c;这个热度只有在评论里有&#xff0c;点击赞的时候&#xff0c;热度…

LeetCode:2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

如何使用ArcGIS去除卫星影像上的云

虽然目前发布的地图都是对云量进行过筛选&#xff08;一般低于20%&#xff09;&#xff0c;但是还是有可能会遇到有云的情况&#xff08;特别是下载历史影像的时候&#xff09;&#xff0c;那么这些云应该怎么去除呢&#xff0c;我们可以尝试使用ArcGIS进行处理。 识别像素 将…

数据结构--二叉树-堆(1)

文章目录 树概念相关的基本概念树的表示 二叉树概念特殊二叉树性质 堆二叉树的顺序结构堆的概念 堆的实现初始化数组初始化为堆向上调整向下调整插入删除打印、摧毁、判空、获取堆顶数据验证 堆的应用堆排序TopK问题 树 概念 树是一种常见的非线性的数据结构&#xff0c;&…

Mysql->Hudi->Hive

一 准备 1.启动集群 /hive/mysql start-all.sh2.启动spark-shell spark-shell \--master yarn \ //--packages org.apache.hudi:hudi-spark3.1-bundle_2.12:0.12.2 \--jars /opt/software/hudi-spark3.1-bundle_2.12-0.12.0.jar \--conf spark.serializerorg.apache.spark.…