JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别
我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** @author Rob Sivan* @date 2022/9/19 20:30* @describe 身份证解析工具类*/public class IDCardUtil {public static void main(String[] args) {//预获取身份证号码System.out.println("请输入身份证号码:");String SId = new Scanner(System.in).nextLine();if (SId.length() == 15) {SId = SIdConversion(SId);}if (SId.length() != 18) {System.out.println("请输入有效的身份证号码!");} else if (IDVerification(SId)) {// 前六位表示地址码,精确到县char[] areaCode = new char[6];for (int i = 0; i < 6; i++) {areaCode[i] = SId.charAt(i);}String area = new String(areaCode);// 从身份证中获取出生年月日并转换为Stringchar[] birthDate = new char[8];for (int i = 0; i < 8; i++) {birthDate[i] = SId.charAt(i + 6);}//获取当前日期并转换为字符串Date date = new Date();SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");String nowDate = df.format(date);//根据二者转换出年龄int age = (Integer.parseInt(nowDate) - Integer.parseInt(String.valueOf(birthDate))) / 10000;StringBuilder sb = new StringBuilder(String.valueOf(birthDate));sb.insert(4, "-");sb.insert(7, "-");String birth = sb.toString();// 得到17位性别码String gender = SId.charAt(16) % 2 == 1 ? "男" : "女";// 执行输出方法printInfo(area, birth, gender, age);}}// 15位身份证转18位方法public static String SIdConversionE(String SId) { // 解析版String sid;// 前六位表示地址码,精确到县char[] areaCode = new char[8];for (int i = 0; i < 6; i++) {areaCode[i] = SId.charAt(i);}String area = new String(areaCode);// 第七到十二位为出生年月日,较18位身份证少了年的前两位char[] birthDate = new char[8];birthDate[0] = '1';birthDate[1] = '9';for (int i = 2; i < 8; i++) {birthDate[i] = SId.charAt(i + 4);}String birth = new String(birthDate);// 第十三到十四位char[] otherNum = new char[2];for (int i = 0; i < 2; i++) {otherNum[i] = SId.charAt(i + 12);}String other = new String(otherNum);// 第十五位性别String gander = SId.substring(14);// 通过最后三位得到此时的17位身份证String SIdTemp = area + birth + other + gander;// 将此时15+2=17位的身份证与对应加权位数字相乘并相加final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 18; i++) {int a = SIdTemp.charAt(i);int b = WEIGHTING_FACTOR[i];sum = sum + (a * b);}// 将和对11取模得到最后一位校验码final String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码String check = CHECK_CODE[((sum / 11) - 1)];// 17位身份证加上最后一位校验码得到18位身份证sid = SIdTemp + check;return sid;}public static String SIdConversion(String SId) {StringBuilder sb = new StringBuilder(SId);sb.insert(6, "19");String s = sb.toString();System.out.println(s);final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 17; i++) {int a = s.charAt(i) - 48;int b = WEIGHTING_FACTOR[i];sum += a * b;}System.out.println(sum);int checkNum = sum % 11;String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码return s + CHECK_CODE[checkNum];}// 验证身份证是否正确public static boolean IDVerification(String SId) {String check = SId.substring(17);final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 17; i++) {int a = SId.charAt(i) - 48;int b = WEIGHTING_FACTOR[i];sum += a * b;}int checkNum = sum % 11;
// System.out.println(checkNum);final String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码return check.equals(CHECK_CODE[checkNum]);}// 输出方法public static void printInfo(String area, String birth, String gender, int age) {System.out.println("-----身份证ID解析成功!-----");System.out.println("该身份证持有人的地区码为:" + area +"\n出生日期为:" + birth +"\n性别为" + gender +"\n当前年龄为:" + age);}
}
首先会判断输入数字是否满足18位或15位,不满足直接抛出异常,之后再对15位转18位处理,在切割获得区域代码、生日,利用性别码判断出性别,最后通过生日计算当前年龄,最后输出,具体使用场景肯定不会这样调用,多用在从前端获取到身份证号后,后端直接进行解析该用户的信息,直接存于数据库,减少用户输入,并可以反馈给前端部分用户信息用作展示。
嗯,就这么多,主要是通过思路,小阿凡继续溜咯~
JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别相关推荐
- Jquery 对 身份证号码的验证 (15/18位)
//欢迎验证.给予指正错误,从好多地方查来的资料修改的...已用本人身份证验证... 由于以前修改的问题无法验证带 X 的身份证号码,已修复!//为值添加0function Append_zore(t ...
- Java实现身份证号码的验证,JAVA后台验证身份证号码
代码如下: package cn.gov.csrc.util;/*** 18 位身份证验证器* * @author admin* */ public class IDCard {final int[] ...
- Java判断身份证号码
1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- JAVA 身份证号码有效性验证
本文转自:http://www.blogjava.net/zeroline/archive/2011/01/03/342227.html </pre><pre name=" ...
- Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)
项目场景: 提示:这次做项目的时候遇到一个工具,整理出来以后可以直接使用 问题描述:给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 身份证号码分为 15 位 和18 ...
- 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...
- 验证(15位或者18位)身份证号码的正确正则表达式
我们在开发页面的过程中难免会遇到一些表单验证,以下就对身份证号码进行验证,在开发过程中做的简单笔记: 身份证号码: 18位(xxxxxx yy MM dd xxxx) 15位(xxxxxx yy MM ...
- 15位或18位长度身份证号码JS验证
免责声明:身份证号为随机组合而成,不会涉及任何隐私泄密问题,也非现实生活中真实的身份证号码:身份证号码所属年龄均为18岁以上,均已通过校验. var IdNum1 = "3205831986 ...
- Java身份证号码严格验证(第18位校验码算法实现)
/*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...
最新文章
- 大厂php怎么做前端,大厂前端经典面试问题精选(附答案)
- Java Review - ArrayList 源码解读
- Matlab中配置LibSVM 总结
- boost::describe模块实现打印功能的测试程序
- webpack编译过程
- 上周热点回顾(7.9-7.15)
- python实现视频关键帧提取(基于帧间差分)
- bootstrap使用
- java invokelater 以及invokeandwait
- 提问的智慧(学习笔记)
- java计算机毕业设计家庭安防系统MyBatis+系统+LW文档+源码+调试部署
- bili弹幕姬_bilibili弹幕姬怎么用 - 卡饭网
- Eclipse4.6(neno)手动配置Tomcat插件
- Unity中的矩阵含义
- 运用matlab求身高质量指数BMI值
- Aircrack-ng支持网卡列表(上)
- 全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置
- python recv_python网络编程调用recv函数完整接收数据的三种方法
- etch下面,用wine可以安装超星阅览器
- 前亚马逊工程师:广告系统架构解密
热门文章
- 软件无线电技术学习资料大汇总
- Linux内核(2)——子系统
- 实用小工具:加密软件
- 传输层——计算机网络
- 别再问我“输入URL到页面呈现”啦
- 程序员去美国工作:工作在加州的华为
- 【webshell管理工具之一】中国菜刀
- 2022 199管综真题及答案解析
- 计算机函数公式发生额总计,如何用Excel Sumif函数做查询模板统计客户在不同时间借款的总金额...
- 求助!spyder beautifulsoup4显示错误:AttributeError: 'HTMLParserTreeBuilder' object has no attribute 'initia