Java校验身份证号码合法性

java 身份证校验,校验码校验 package cn.myapps.runtime.rest.core.util; import org.apache.commons.lang3.StringUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; im... 阅读详情
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/** 
 * 作用:校验身份证是否合法
 * 身份证号码的格式:610821-20061222-612-X 
 * 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码, 
 * 第18位为校验码。检验码分别是0-10共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。  
 * 当今的身份证号码有15位和18位之分。1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。 
 * 依照《中华人民共和国居民身份证法》规定,依照《中华人民共和国居民身份证条例》领取的居民身份证,自2013年1月1日起停止使用,在2012年1月1日以前领取的居民身份证,在其有效期内,继续有效,因此还可能会有部分有效身份证为15位数。
 * 各数位数字含义:
 * (1)前1、2位数字表示:所在省份的代码;  
 * (2)第3、4位数字表示:所在城市的代码; 
 * (3)第5、6位数字表示:所在区县的代码; 
 * (4)第7~14位数字表示:出生年、月、日; 
 * (5)第15、16位数字表示:所在地的派出所的代码;  
 * (6)第17位数字表示性别:奇数表示男性,偶数表示女性 
 * (7)第18位数字是校检码:根据一定算法生成 
 * @author jiangfei
 * 
 */  
public class CheckIdcardIsLegal {


public static String checkIdCard(String Idcard){

String mesgStr = "";
String Id = "";
//最后位为X或x时统一大写
Idcard = Idcard.toUpperCase();
//判断号码的长度为18位
if(Idcard.length()!=15 && Idcard.length()!=18){
mesgStr = "身份证号码位数应该为15位或18位!";
return mesgStr;
}
//如果为15位,则所有号码都为数字,如果为18位,前17位为数字
if(Idcard.length()==15){
//将15位身份证转换为17位数字
Id = Idcard.substring(0, 6) + "19" + Idcard.substring(6, 15);  

}else if(Idcard.length()==18){
Id = Idcard.substring(0, 17);
}

if(!isNumeric(Id)){
mesgStr = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字!";
return mesgStr;
}

// 判断出生年月是否有效   
        String strYear = Id.substring(6, 10);// 年份  
        String strMonth = Id.substring(10, 12);// 月份  
        String strDay = Id.substring(12, 14);// 日期  
        if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {  
        mesgStr = "身份证出生日期无效!";  
            return mesgStr;  
        }  
        GregorianCalendar gc = new GregorianCalendar();  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
        try {  
            if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150  
                    || (gc.getTime().getTime() - sdf.parse(  
                            strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {  
            mesgStr = "身份证生日不在有效范围!";  
                return mesgStr;  
            }  
        } catch (NumberFormatException e) {  
            e.printStackTrace();  
        } catch (java.text.ParseException e) {  
            e.printStackTrace();  
        }  
        if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {  
        mesgStr = "身份证月份无效!";  
            return mesgStr;  
        }  
        if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {  
        mesgStr = "身份证日期无效!";  
            return mesgStr;  
        }  

        // 判断地区码是否有效   
        Hashtable<String,String> areacode = GetAreaCode();  
        //如果身份证前两位的地区码不在Hashtable,则地区码有误  
        if (areacode.get(Id.substring(0, 2)) == null) {  
            mesgStr = "身份证地区编码错误!";  
            return mesgStr;  
        }  
          
        if(isVarifyCode(Id,Idcard)==false){  
        mesgStr = "身份证校验码无效,不是合法的身份证号码!";  
            return mesgStr;  
        }  
return "yes";
}

/**判断第18位校验码是否正确 
* 第18位校验码的计算方式:  
* 1. 对前17位数字本体码加权求和  
* 公式为:S = Sum(Id[i]* WT[i]), i = 0, ... , 16  
* 其中Id表示第i个位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2  
* 2. 用11对计算结果取模  
* Y = mod(S, 11)  
* 3. 根据模的值得到对应的校验码  
* 对应关系为:  
* Y值:     0  1  2  3  4  5  6  7  8  9  10  
* 校验码:  1  0  X  9  8  7  6  5  4  3   2 
    */  
   private static boolean isVarifyCode(String Id,String IDStr) {  
        String[] VarifyCode = { "1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2" };  
        String[] WT = { "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++) {  
           sum = sum + Integer.parseInt(String.valueOf(Id.charAt(i))) * Integer.parseInt(WT[i]);  
        }  
        int modValue = sum % 11;  
        String strVerifyCode = VarifyCode[modValue];  
       Id = Id + strVerifyCode;  
        if (IDStr.length() == 18) {  
            if (Id.equals(IDStr) == false) {  
                return false;  
            }  
        }   
        return true;  
   }  
/** 
     * 判断字符串是否为数字,0-9重复0次或者多次    
     * @param  
     * @return 
     */  
    private static boolean isNumeric(String strnum) {  
        Pattern pattern = Pattern.compile("[0-9]*");  
        Matcher isNum = pattern.matcher(strnum);  
        if (isNum.matches()) {  
            return true;  
        } else {  
            return false;  
        }  
    } 

    /** 
     * 判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天 
     * @param string 
     * @return 
     */  
    public static boolean isDate(String strDate) {  
      
        Pattern pattern = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|" +
                "([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|" +
                "([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|" +
                "([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$");  
        Matcher m = pattern.matcher(strDate);  
        if (m.matches()) {  
            return true;  
        } else {  
            return false;  
        }  
    }  

    /** 
     * 将所有地址编码保存在一个Hashtable中     
     * @return Hashtable对象 
     */  
    private static Hashtable<String,String> GetAreaCode() {  
        Hashtable<String,String> hashtable = new Hashtable<String,String>();  
        hashtable.put("11", "北京");  
        hashtable.put("12", "天津");  
        hashtable.put("13", "河北");  
        hashtable.put("14", "山西");  
        hashtable.put("15", "内蒙古");  
        hashtable.put("21", "辽宁");  
        hashtable.put("22", "吉林");  
        hashtable.put("23", "黑龙江");  
        hashtable.put("31", "上海");  
        hashtable.put("32", "江苏");  
        hashtable.put("33", "浙江");  
        hashtable.put("34", "安徽");  
        hashtable.put("35", "福建");  
        hashtable.put("36", "江西");  
        hashtable.put("37", "山东");  
        hashtable.put("41", "河南");  
        hashtable.put("42", "湖北");  
        hashtable.put("43", "湖南");  
        hashtable.put("44", "广东");  
        hashtable.put("45", "广西");  
        hashtable.put("46", "海南");  
        hashtable.put("50", "重庆");  
        hashtable.put("51", "四川");  
        hashtable.put("52", "贵州");  
        hashtable.put("53", "云南");  
        hashtable.put("54", "西藏");  
        hashtable.put("61", "陕西");  
        hashtable.put("62", "甘肃");  
        hashtable.put("63", "青海");  
        hashtable.put("64", "宁夏");  
        hashtable.put("65", "新疆");  
        hashtable.put("71", "台湾");  
        hashtable.put("81", "香港"); 
        hashtable.put("82", "澳门");  
        hashtable.put("91", "国外");  
        return hashtable;  
    }
    
    public static void main(String[] args) {
    String string = CheckIdcardIsLegal.checkIdCard("610821200612225123");
    System.out.println(string);
}
    
}
073-java实现验证身份证号码的合法性 使用java实现验证身份证号码的完整性,对身份证的长度,省市县,出生日期,验证码等进行全方位验证, 阅读详情

相关推荐

Java身份证号码合法性校验算法,正则表达式。

最完善的身份证号码合法性校验Java算法,适合Android平台,可以直接拿来在项目中使用,正则表达式。

Java编写程序判断身份证是否合法

Java编写程序判断身份证是否合法 需求 我国的居民身份证号码,由十七位数字本体码和一位数字校验码组成。定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。 设计思路 使用键盘录入一个身份证号字符串,定义一个方法接收。查看String类的相关API,遍历该字符串进行判断。 代码实现 package com.itheima.APITest.Test06; import java.util.Sc

l_0_f_16的博客 4651

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

Java身份证号码合法性校验与解析

【代码】Java身份证号码合法性校验与解析。

hkm的博客 1484

基于Ansys Fluent和Mechanical的血管稳态流固耦合模型

流固耦合模型在医学中也会被用到,本次小编为大家带来针对人造血管内血液流动的仿真实例。 在开物云平台上找到Workbench 点击进入:https://cloud.yuansuan.cn/?user_source=community 在左侧的Toolbox中找到对应的模块:Fluid Flow(Fluent)和Static Structure 双击“Geometry”,进入建模功能 文件-打开-找到保存的模型文件 退回到主界面,在fluid flow(Fluent)中找到mesh

huasheng233的博客 3910

植物GO注释

本文主要是对没有GO term库的植物进行注释。 1、选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2、比如我以甜菜为例 为了找到和GO term对应的ID,先找到PLAZA,进入网站https://bioinformatics.psb.ugent.be/plaza/versions/plaza_v3_di...

weixin_30300225的博客 2229

Java版通用身份证验证

Java版通用身份证验证 转自:此大佬 package com.jdkj.detectSystem.Util; import lombok.SneakyThrows; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @program: jdkj_detectSystem * @descripti

weiqiang915的博客 1731

Java开发者必看:Apache PDFBox实现PDF数字签名完整指南(附源码)

本文为Java开发者提供了使用Apache PDFBox实现PDF数字签名的完整指南。详细介绍了从环境配置、核心原理到完整代码实现的全过程,涵盖证书管理、签名位置计算、性能优化及实际应用案例,并附有可直接复用的源码,帮助开发者高效集成PDF数字签名功能。

o1p2q3r的博客 340

身份证号码合法性校验工具类

【代码】身份证号码合法性校验工具类。

九离的博客 1085

Multisim实战:从零搭建体温检测报警电路(附完整仿真文件+调试技巧)

本文详细介绍了如何使用Multisim从零搭建体温检测报警电路,涵盖LM35温度传感器、LM358运算放大器等核心器件的选型与连接,以及信号调理、阈值比较和数码管显示等关键电路设计。附赠完整仿真文件和实用调试技巧,帮助电子工程初学者快速掌握体温温度检测系统的设计与实现。

weixin_28285943的博客 294

华为OD机试新系统真题 【LLM推理批次最大化】

华为OD机试 新系统真题【LLM推理批次最大化】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【LLM推理批次最大化】多语言题解。

qq_45776114的博客 573

身份证校验工具

具体含义分别是:6位地址码+8位出生日期+3位顺序码+1位校验码,校验码可能为字母。1、身份证号码是18位数,分别是17位数字和1位校验码。2、顺序码如果是奇数代表男性,偶数代表女性。3、最后1位校验码是根据前17位数字算出来的。来自:一名小小程序员。

shenxiaomo1688的博客 890

基于 Qt C++ 开发一套西门子量子测量系统的控制与数据采集平台

sensorIdCombo->addItems({"QTS-100-001 (温度)", "QPG-200-001 (压力)", "QDS-300-001 (位移)"});precisionTable->setHorizontalHeaderLabels({"传感器ID", "类型", "标称精度", "实际精度", "校准状态"});QWidget *dispWidget = createSensorWidget("量子位移", "mm (±1μm)", 50.0, 0.001);// 传感器状态更新。

寒寒豆豆软件公司的博客 255

【实用工具类】Java身份证号码合法性校验与解析~~复制粘贴直接用

Java身份证号码合法性校验与解析

Eayon阳阳阳仔 475

【华为OD技术面】 - 考到的Lettcode手撕算法代码真题目录

【华为OD技术面 - 考到的Lettcode手撕算法代码真题目录

算法大师! 7821

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

新旧身份证合法性验证及相互转换算法

新旧身份证合法性验证及相互转换算法——谨以此文献给共事3年即将离职的PPL作者:成晓旭   前天,看到PPL在一个需要网站上注册,但该网站要求输入一个身份证号码,并且随便输入一个还不行:对方还要验证输入身份证的合法性,所以,烦得PPL在网上到处去找。基于此目前,特别在网上收集身份证相关的资料,整理成文,作为给PPL饯行的礼物之一,公布于我的Blog。也预祝PPL:“找份好工作,找个好老婆!” 

.NET博文收藏 771

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java身份证号校验

package Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import...

aizhen5509的博客 288

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

100个Java工具类之16:身份证校验器

本文主要讲述:身份证校验器,主要校验身份证的合法性。身份证号码校验规则:1、身份证号码是18位数,分别是17位数字和1位校验码。具体含义分别是:6位地址码+8位出生日期+3位顺序码+1位校验码,校验码可能为字母2、顺序码如果是奇数代表男性,偶数代表女性。3、最后1位校验码是根据前17位数字算出来的。

zmynkm的博客 577

比较全面的身份证校验、提取的方法

比较全面的身份证校验、提取的方法。

zhangxin09的专栏 810

L1-016 查验身份证 - java

L1-016 查验身份证 时间限制 400 ms 内存限制 64 MB 题目描述: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值: Z:0 1 2 3 4 5 6 7 8 9 10 M:1 0 X 9 8 7 6 5 4 3 2 现在给定一些身份证号码,请你验证校验码的有

谢谢 啊sir的博客 470

身份证号码编码规则及校验位校验算法

一、身份证号码作为独一无二代表公民信息的号码,它的组成是由一下的数字表示的: (1)第1、2位数字表示:所在省(直辖市、自治区)的代码; (2)第3、4位数字表示:所在地级市(自治州)的代码; (3)第5、6位数字表示:所在区(县、自治县、县级市)的代码; (4)第7—14位数字表示:出生年、月、日; (5)第15、16位数字表示:所在地的派出所的代码; (6)第17位数字表示性别:奇数表示男性,偶数表示女性; (7)第18位数字是校检码:是根据《中华人民共和国国家标准GB 11643-1999》中有关公民

qq_29543657的博客 1万+

java身份证合法性校验并提取身份证有效信息

java身份证合法性校验并提取身份证有效信息 时间:2016-11-19 15:28 来源:网管之家整理 字体:[大 中 小] 评论:0 java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下 java身份证合法性校验 /**身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T 2260-2007 中华人

chenhuakang的博客 733
下一篇: 如何区分360浏览器和谷歌浏览器
github_38806262
博客等级 码龄10年 8粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值