身份证号码验证
package com.lishi.idcatch;
import java.text.ParseException;
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;
/*********************************** 身
****************************************/
/**份证验证开始
* 身份证号码验证
*
1、号码的结构
* 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,
* 八位数字出生日期码,三位数字顺序码和一位数字校验码。
*
2、地址码(前六位数)
* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
*
3、出生日期码(第七位至十四位)
* 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
*
4、顺序码(第十五位至十七位)
* 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,
* 顺序码的奇数分配给男性,偶数分配给女性。
*
5、校验码(第十八位数)
* (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
* Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4
* 2 (2)计算模 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
* 2)现在校验最后一位 x必须是大写,其他没有区别!(X表示11)
*/
public class IdHolder {
/**
* 功能:身份证的有效验证
* @param IDStr 身份证号
* @return 有效:返回"" 无效:返回String信息* @throws ParseException*/public static String IDCardValidate(String IDStr) throws ParseException {String errorInfo = "";// 记录错误信息String[] ValCodeArr = { "1", "0", "X", "9", "8", "7", "6", "5", "4","3", "2" };String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7","9", "10", "5", "8", "4", "2" };
为数字。";
String Ai = "";// ================ 号码的长度 15位或18位 ================if (IDStr.length() != 15 && IDStr.length() != 18) {errorInfo = "身份证号码长度应该为15位或18位。";return errorInfo;}// =======================(end)========================// ================ 数字 除最后以为都为数字 ================if (IDStr.length() == 18) {Ai = IDStr.substring(0, 17);} else if (IDStr.length() == 15) {Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);}if (isNumeric(Ai) == false) {errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应return errorInfo;}// =======================(end)========================// ================ 出生年月是否有效 ================String strYear = Ai.substring(6, 10);// 年份String strMonth = Ai.substring(10, 12);// 月份String strDay = Ai.substring(12, 14);// 月份if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {errorInfo = "身份证生日无效。";return errorInfo;}GregorianCalendar gc = new GregorianCalendar();SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");if ((gc.get(Calendar.YEAR)s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {errorInfo = "身份证生日不在有效范围。";
return errorInfo;}if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {errorInfo = "身份证月份无效";return errorInfo;}if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {errorInfo = "身份证日期无效";return errorInfo;}// =====================(end)=====================// ================ 地区码时候有效 ================Hashtable h = GetAreaCode();if (h.get(Ai.substring(0, 2)) == null) {errorInfo = "身份证地区编码错误。";return errorInfo;}// // ================ 判断最后一位的值 ================int TotalmulAiWi = 0;for (int i = 0; i < 17; i++) {TotalmulAiWi = TotalmulAiWi+ Integer.parseInt(String.valueOf(Ai.charAt(i)))* Integer.parseInt(Wi[i]);}int modValue = TotalmulAiWi % 11;String strVerifyCode = ValCodeArr[modValue];Ai = Ai + strVerifyCode;//x必须为大写if (IDStr.length() == 18) {if (Ai.equals(IDStr) == false) {errorInfo = "身份证无效,不是合法的身份证号码";return errorInfo;}} else {return "";}// =====================(end)=====================return "";}/**
* 功能:设置地区编码* @return Hashtable 对象*/private static Hashtable GetAreaCode() {Hashtable hashtable = new Hashtable();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;}/**
* 功能:判断字符串是否为数字
* @param str
* @return
*/
private static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (isNum.matches()) {
return true;
} else {
return false;
}
}
/**
* 功能:判断字符串是否为日期格式
* @param str
* @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]))))))(s(((0?[0-9])|([1-2][0-3])):([0-5]?[0-9])((s)|(:([0-5]?[0-9])))))?$");
Matcher m = pattern.matcher(strDate);
if (m.matches()) {
return true;
} else {
return false;
}
}
/**
* 顺序码味12-15或者14-17 为 1表示男,0表示女
* @param id 身份证号
* @return
*/
public static int getSex(String id) {
String num = "";
if (id.length() == 15) {
num = id.substring(12, 15);
}
if (id.length() == 18) {
num = id.substring(14, 17);
}
int p = Integer.parseInt(num);
return p % 2;
}
/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {// String IDCardNum="210102820826411";// String IDCardNum="210102198208264114";String IDCardNum = "430921198907201343";//IdHolder cc = new IdHolder();
System.out.println(IdHolder.IDCardValidate(IDCardNum));// System.out.println(cc.isDate("1996-02-29"));}
/*********************************** 身份证****************************************/
} 验证结束
身分證號碼的驗證規則
一般而言大家對身份字號的認知,多是知道共有10位,位第一位為英文字母,知道再多一點的大概就是第二個數字是男女生之分,男生為 1,女生為 2,接下來的一陀數字,是不是隨便輸入都可以呢?其實是不可以的。
身份證字號後面八個數字不是隨便打一些數字就可以了,其實前面七個可以隨便打,但是最後一位為檢查碼,必須經過之前一個字母與8個數字的組合計算後得出,以下即為檢查碼的運算原則:
1. 英文代號以下表轉換成數字
2. 3. 4. 5. 6. 7. 8. 9. 10. 11. A=10 台北市 J=18 新竹縣 S=26 高雄縣 B=11 台中市 K=19 苗栗縣 T=27 屏東縣 C=12 基隆市 L=20 台中縣 U=28 花蓮縣 D=13 台南市 M=21 南投縣 V=29 台東縣 E=14 高雄市 N=22 彰化縣 * W=32 金門縣 F=15 台北縣 * O=35 新竹市 X=30 澎湖縣 G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山 H=17 桃園縣 Q=24 嘉義縣 * Z=33 連江縣 * I=34 嘉義市 R=25 台南縣
12. 英文轉成的數字, 個位數乘9再加上十位數
13. 各數字從右到左依次乘1、2、3、4....8
14. 求出(2),(3)之和 15. 求出(4)除10後之餘數,用10減該餘數,結果就是檢查碼,若餘數為0,檢查碼就是 0。
例如: 身分證號碼是 F121955337
F 1 2 1 9 5 5 3 3
1 5 x x x x x x x x x x 1 9 8 7 6 5 4 3 2 1 ───────────────────── 1+45+8+14+6+45+20+15+6+3=163 163/10=16....3 (餘數) 10-3=7 (檢查碼)
以上資訊由 u881510@oz.nthu.edu.tw 提供,在此致謝。
EXCEL中如何提取身份证出生日期、性别、检验身份证号
码的正确性
中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。
18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。
其中3位数字顺序码,是为同一地址码的同年同月同日出生人员编制的顺序号,偶数的为女性,奇数的为男性。
1、提取籍贯地区的行政区划代码(A2为身份证号,下同)
15与18位通用:=LEFT(A2,6)
如果有一个编码和省份地区的对照表,可以用VLOOKUP函数来提取地区信息。2、提取出生日期信息
15位:=--TEXT(19&MID(A2,7,6),"#-00-00")
18位:=--TEXT(MID(A2,7,8),"#-00-00")
15与18位通用:=--TEXT(IF(LEN(A2)=15,19,"")&MID(A2,7,6+IF(LEN(A2)=18,2,0)),"#-00-00")
简化公式:=--TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00")(请将输入公式的单元格格式设置为日期格式)
3、提取性别信息
15位:=IF(MOD(RIGHT(A2),2)=1,"男","女")
18位:=IF(MOD(MID(A2),17,1)=1,"男","女")
15与18位通用:=IF(MOD(MID(A2,IF(LEN(A2)=15,15,17),1),2)=1,"男","女")简化公式:=IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女")
4、检验身份证号码的正确性
18位身份证号码的最后一位是检验码,它是根据身份证前17位数字依照规则计算出来的,其值0~9或X。一般情况只要有一位数字输入错误,依照规则计算后就会与第18位数不符。当然不排除按错误号码计算后恰好与检验码相符的情况,但这种情况出现的可能性较低。因此,对18位号码的验证采用如下公式:
=MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2,1)
对于15位身份证,由于没有检验码,我们只能简单地去判断出生日期代码是否是一个有效的日期,避免输入一些像“731302”或“980230“等这样不存在的日期。
=ISNUMBER(--TEXT(19&MID(A2,7,6),"#-00-00"))
综合15位和18位后的通用公式为:
=IF(LEN(A2)=18,MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2),IF(LEN(A2)=15,ISNUMBER(--TEXT(19&MID(A2,7,6),"#-00-00"))))
由于目前15位身份证号码已经很少了,如果对15位的号码不需要作进一步的判断,则公式可以简化成:
=IF(LEN(A2)=18,MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2),LEN(A2)=15)
将上面的公式放到B2单元格,如果结果为TRUE,则身份证号是正确的,结果为FALSE则是错误的。
你也可以将上述公式放在数据有效性中,防止录入错误的身份证号。操作方法:选择需要输入身份证的全部单元格区域,比如A2:A10,点菜单"数据"-"有效性",在"允许"的下拉框中选择"自定义",在"公式"输入上面的15位和18位通用公式,确定以后即可。注意:公式里的"A2"是你刚才选定要输入身份证的单元格区域的第一个单元格,如果你是要在C3:C20输入身份证号,则将公式里的"A2"改为"C3"。另外,你也可以先设置好某单个单元格的数据有效性(这时公式的A2改为选定的单元格),再用格式刷将其格式刷到其他需要相同设置的单元格。5、15位升为18位
=IF(LEN(A2)=15,REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUMPRODUCT(MID(REPLACE(A2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),A2)
6、18位转换为15位
=IF(LEN(A2)=18,LEFT(REPLACE(A2,7,2,),15),A2)
7、示例
表中公式:
B2 =IF(LEN(A2)=18,MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2),IF(LEN(A2)=15,ISNUMBER(--TEXT(19&MID(A2,7,6),"#-00-00"))))
C2 =IF(A2<>"",TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00")+0,)D2 =IF(A2<>"",IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女"),)
E2 =IF(A2<>"",DATEDIF(TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00"),TODAY(),"y"),)
F2 =IF(A2<>"",VLOOKUP(LEFT(A2,2),地区表!A:D,2,),)
H2 =IF(LEN(A2)=15,REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUMPRODUCT(MID(REPLACE(A2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),A2)I2 =IF(LEN(A2)=18,LEFT(REPLACE(A2,7,2,),15),A2)
公民身份号码更正证明存根
№ 重号当事人姓名:
重号当事人住址: 更正前公民身份号码 : 更正后公民身份号码:
更正原因:重号/错号
申请人住址: 申请理由:
申请人签名:
经 办 人:
联系电话:更正日期:年
月
日 公民身份号码更正证明 № 本辖区公民 :
(曾用名
)
住址:
原使用的公民身份号码为:
系(重/错)号。根据《中华人民共和国居民身份证法》的有关规定及公民身份号码的编制原则,为确保公民身份号码的准确性和唯一性, 自
年
月
日起将原号码更正为:
特此证明
所属县区派出所 (户口专用章)
年
月
日
注:请为申请人办理公民身份号码变更的相关事宜。此件为原件,如需要请留存复印件。 发函单位联系电话:
公安部治安管理局制
身份证号码变更证明第一条 为了证明居民身份,便利公民进行社会活动,维护社会秩序,保障公民的合法权益,制定本条例。
第二条 居住在中华人民共和国境内的年满十六周岁的中国公民应当依照本条例的规定,申请领取中华人民共和国居民身份证。
正在服现役的人民解放军军人、人民武装警-察,不领取居民身份证,由中华人民共和国中央军事委员会和中国人民武装警-察部队总部颁发军人和武装警-察身份证件。
第三条 居民身份证登记项目包括姓名、性别、民族、出生日期、住址。居民身份证登记项目使用全国通用的文字填写。
民族自治地方的自治机关根据本地区的实际情况,可以决定同时使用本民族的文字或者选用一种当地通用的民族文字。
第四条 居民身份证的有效期限分为十年、二十年、长期三种。十六周岁至二十五周岁的,发给有效期十年的居民身份证;二十六周岁至四十五周岁的,发给有效期二十年的居民身份证;四十六周岁以上的,发给长期有效的居民身份证。
第五条 居民身份证由公安机关统一印制,颁发和管理。
第六条 公民应当向常住户口所在地的户口登记机关申请领取居民身份证,并按照规定履行申请领取手续。
第七条 华侨回国定居的,在办理户口登记手续时,申请领取居民身份证。 第八条 居民身份证有效期满或者登记内容有变更、更正或者证件严重损坏不能辩认时,应当按照规定申报换领新证;丢失证件的,应当申报补领。
第九条 公民被征集服现役的,在办理注销户口手续时,交回居民身份证;退回现役后,发还居民身份证或者再申请领取居民身份证。 第十条 被判处拘役、有期徒刑以上刑罚的人和被劳动教养的人以及被羁押的人,尚未申请领取居民身份证的,在服刑、劳动教养和羁押期间,不发给居民身份证;已领取居民身份证的,由执行机关按照规定收缴其居民身份证;释放或者解除劳动教养后,由本人申请领取居民身份证或者将原居民身份证发还本人。
第十一条 公民出境按照规定需要注销户口的,在办理注销户口手续时,交回居民身份证。 第十二条 公民死亡的,由公安机关收回居民身份证。
第十三条 公安机关在执行任务时,有权查验居民身份证,被查验的公民不得拒绝。执行任务的公安人员在查验公民的居民身份证时,应当出示自己的工作证件。
公安机关除对于依照《中华人民共和国刑事诉讼法》被执行强制措施的人以外,不得扣留公民的居民身份证。
第十四条 公民在办理涉及政治、经济、社会生活等权益的事务时,可以出示居民身份证,证明其身份。有关单位不得扣留或者要求作为抵押。 第十五条 有下列行为之一的,按照《中华人民共和国治安管理处罚条例》有关规定给予处罚: (一)拒绝公安机关查验居民身份证的; (二)转让、出借居民身份证的; (三)使用他人居民身份证的; (四)故意毁坏他人居民身份证的; 第十六条 伪造、变造居民身份证的或者窃取居民身份证情节严重的,依照《中华人民共和国刑法》第一百六十七条的规定处罚。
第十七条 公安机关工作人员在执行本条例时,徇私舞弊、侵害公民合法权利和利益的,应当给予行政纪律处分,情节严重构成犯罪的,应当依法追究刑事责任。
第十八条 居留在中华人民共和国境内的外国人和无国籍人,不适用本条例。 第十九条 本条例的实施细则,由公安部制定,报国务院批准后施行。 第二十条 本条例自公布之日起施行。 【章名】 附:刑法有关条文
第一百六十七条 伪造、变造或者盗窃、抢夺、毁灭国家机关、企业、事业单位、人民团体的公文、证件、印章的,处三年以下有期徒刑、拘役、管制或者剥夺政治权利;情节严重的,处三年以上十年以下有期徒刑。
身份证号码中这些数字是怎样排列的,每个数字表示什么意思呢?下面就让我们一起来探索其中的规律吧!新的身份证号码是由18位数字组成的,它们分别表示:
(1)前
1、2位数字表示:所在省份的代码; (2)第
3、4位数字表示:所在城市的代码; (3)第
5、6位数字表示:所在区县的代码; (4)第7~14位数字表示:出生年、月、日;
(5)第
15、16位数字表示:所在地的派出所的代码;
(6)第17位数字表示性别:奇数表示男性,偶数表示女性;
(7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,
用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
15位的身份证号 dddddd yymmdd xx p 18位的身份证号
dddddd yyyymmdd xx p y
其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同 yyyymmdd yymmdd 为出生年月日 xx顺号类编码 p性别
18位中末尾的y为校验码,将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:
1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验的计算方式:
1. 对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0, ... , 16
其中Ai表示第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
推荐阅读:
身份证号码验证(精选6篇)06-27
验证身份证正确(精选6篇)05-02
身份证批量验证程序(精选6篇)07-31
新员工身份证验证程序(精选3篇)07-06
二代身份证号码(推荐7篇)01-13
身份证号码查重(共6篇)06-13
湖北身份证号码格式(推荐6篇)07-27
探索身份证号码的奥秘(推荐7篇)08-13
未满18岁的身份证号码(共3篇)06-08
有效的身份证号码18岁(推荐6篇)07-03