java身份证合法性校验并提取身份证有效信息
java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下
java身份证合法性校验
/**身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T2260-2007中华人民共和国行政区划代码》): *该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区)、 *市(地区,自治州,盟)、县(自治县、县级市、旗、自治旗、市辖区、林区、特区)。 数字码码位结构从左至右的含义是: 第一层为AB两位代码表示省、自治区、直辖市、特别行政区; 第二层为CD两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中: ——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码; ——21~50表示地区、自治州、盟; ——90表示省(自治区)直辖县级行政区划汇总码。 第三层为EF两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中: ——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码; ——21~80表示县、自治县、旗、自治旗、林区、地区辖特区; ——81~99表示省(自治区)辖县级市。 */ importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; importjava.util.GregorianCalendar; importjava.util.HashMap; importjava.util.Map; importjava.util.regex.Pattern; /** *<p> *类说明:身份证合法性校验 *</p> *<p> *--15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。 *--18位身份证号码 *:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。 *</p> */ @SuppressWarnings({"unchecked","unused","all"}) publicclassIdcardValidator{ /** *省,直辖市代码表:{11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", *21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", *33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", *42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", *51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", *63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} */ protectedStringcodeAndCity[][]={{"11","北京"},{"12","天津"}, {"13","河北"},{"14","山西"},{"15","内蒙古"},{"21","辽宁"}, {"22","吉林"},{"23","黑龙江"},{"31","上海"},{"32","江苏"}, {"33","浙江"},{"34","安徽"},{"35","福建"},{"36","江西"}, {"37","山东"},{"41","河南"},{"42","湖北"},{"43","湖南"}, {"44","广东"},{"45","广西"},{"46","海南"},{"50","重庆"}, {"51","四川"},{"52","贵州"},{"53","云南"},{"54","西藏"}, {"61","陕西"},{"62","甘肃"},{"63","青海"},{"64","宁夏"}, {"65","新疆"},{"71","台湾"},{"81","香港"},{"82","澳门"}, {"91","国外"}}; privateStringcityCode[]={"11","12","13","14","15","21","22", "23","31","32","33","34","35","36","37","41","42","43", "44","45","46","50","51","52","53","54","61","62","63", "64","65","71","81","82","91"}; //每位加权因子 privateintpower[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //第18位校检码 privateStringverifyCode[]={"1","0","X","9","8","7","6","5", "4","3","2"}; /** *验证所有的身份证的合法性 * *@paramidcard *@return */ publicbooleanisValidatedAllIdcard(Stringidcard){ if(idcard.length()==15){ idcard=this.convertIdcarBy15bit(idcard); } returnthis.isValidate18Idcard(idcard); } /** *<p> *判断18位身份证的合法性 *</p> *根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 *排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 *<p> *顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 *</p> *<p> *1.前1、2位数字表示:所在省份的代码;2.第3、4位数字表示:所在城市的代码;3.第5、6位数字表示:所在区县的代码; *4.第7~14位数字表示:出生年、月、日;5.第15、16位数字表示:所在地的派出所的代码; *6.第17位数字表示性别:奇数表示男性,偶数表示女性; *7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 *</p> *<p> *第十八位数字(校验码)的计算方法为:1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584 *216379105842 *</p> *<p> *2.将这17位数字和系数相乘的结果相加。 *</p> *<p> *3.用加出来和除以11,看余数是多少? *</p> *4.余数只可能有012345678910这11个数字。其分别对应的最后一位身份证的号码为10X9876543 *2。 *<p> *5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 *</p> * *@paramidcard *@return */ publicbooleanisValidate18Idcard(Stringidcard){ //非18位为假 if(idcard.length()!=18){ returnfalse; } //获取前17位 Stringidcard17=idcard.substring(0,17); //获取第18位 Stringidcard18Code=idcard.substring(17,18); charc[]=null; StringcheckCode=""; //是否都为数字 if(isDigital(idcard17)){ c=idcard17.toCharArray(); }else{ returnfalse; } if(null!=c){ intbit[]=newint[idcard17.length()]; bit=converCharToInt(c); intsum17=0; sum17=getPowerSum(bit); //将和值与11取模得到余数进行校验码判断 checkCode=getCheckCodeBySum(sum17); if(null==checkCode){ returnfalse; } //将身份证的第18位与算出来的校码进行匹配,不相等就为假 if(!idcard18Code.equalsIgnoreCase(checkCode)){ returnfalse; } } returntrue; } /** *验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 * *@paramidcard *@return */ publicbooleanisValidate15Idcard(Stringidcard){ //非15位为假 if(idcard.length()!=15){ returnfalse; } //是否全都为数字 if(isDigital(idcard)){ Stringprovinceid=idcard.substring(0,2); Stringbirthday=idcard.substring(6,12); intyear=Integer.parseInt(idcard.substring(6,8)); intmonth=Integer.parseInt(idcard.substring(8,10)); intday=Integer.parseInt(idcard.substring(10,12)); //判断是否为合法的省份 booleanflag=false; for(Stringid:cityCode){ if(id.equals(provinceid)){ flag=true; break; } } if(!flag){ returnfalse; } //该身份证生出日期在当前日期之后时为假 Datebirthdate=null; try{ birthdate=newSimpleDateFormat("yyMMdd").parse(birthday); }catch(ParseExceptione){ e.printStackTrace(); } if(birthdate==null||newDate().before(birthdate)){ returnfalse; } //判断是否为合法的年份 GregorianCalendarcurDay=newGregorianCalendar(); intcurYear=curDay.get(Calendar.YEAR); intyear2bit=Integer.parseInt(String.valueOf(curYear) .substring(2)); //判断该年份的两位表示法,小于50的和大于当前年份的,为假 if((year<50&&year>year2bit)){ returnfalse; } //判断是否为合法的月份 if(month<1||month>12){ returnfalse; } //判断是否为合法的日期 booleanmflag=false; curDay.setTime(birthdate);//将该身份证的出生日期赋于对象curDay switch(month){ case1: case3: case5: case7: case8: case10: case12: mflag=(day>=1&&day<=31); break; case2://公历的2月非闰年有28天,闰年的2月是29天。 if(curDay.isLeapYear(curDay.get(Calendar.YEAR))){ mflag=(day>=1&&day<=29); }else{ mflag=(day>=1&&day<=28); } break; case4: case6: case9: case11: mflag=(day>=1&&day<=30); break; } if(!mflag){ returnfalse; } }else{ returnfalse; } returntrue; } /** *将15位的身份证转成18位身份证 * *@paramidcard *@return */ publicStringconvertIdcarBy15bit(Stringidcard){ Stringidcard17=null; //非15位身份证 if(idcard.length()!=15){ returnnull; } if(isDigital(idcard)){ //获取出生年月日 Stringbirthday=idcard.substring(6,12); Datebirthdate=null; try{ birthdate=newSimpleDateFormat("yyMMdd").parse(birthday); }catch(ParseExceptione){ e.printStackTrace(); } Calendarcday=Calendar.getInstance(); cday.setTime(birthdate); Stringyear=String.valueOf(cday.get(Calendar.YEAR)); idcard17=idcard.substring(0,6)+year+idcard.substring(8); charc[]=idcard17.toCharArray(); StringcheckCode=""; if(null!=c){ intbit[]=newint[idcard17.length()]; //将字符数组转为整型数组 bit=converCharToInt(c); intsum17=0; sum17=getPowerSum(bit); //获取和值与11取模得到余数进行校验码 checkCode=getCheckCodeBySum(sum17); //获取不到校验位 if(null==checkCode){ returnnull; } //将前17位与第18位校验码拼接 idcard17+=checkCode; } }else{//身份证包含数字 returnnull; } returnidcard17; } /** *15位和18位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanisIdcard(Stringidcard){ returnidcard==null||"".equals(idcard)?false:Pattern.matches( "(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)",idcard); } /** *15位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanis15Idcard(Stringidcard){ returnidcard==null||"".equals(idcard)?false:Pattern.matches( "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$", idcard); } /** *18位身份证号码的基本数字和位数验校 * *@paramidcard *@return */ publicbooleanis18Idcard(Stringidcard){ returnPattern .matches( "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", idcard); } /** *数字验证 * *@paramstr *@return */ publicbooleanisDigital(Stringstr){ returnstr==null||"".equals(str)?false:str.matches("^[0-9]*$"); } /** *将身份证的每位和对应位的加权因子相乘之后,再得到和值 * *@parambit *@return */ publicintgetPowerSum(int[]bit){ intsum=0; if(power.length!=bit.length){ returnsum; } for(inti=0;i<bit.length;i++){ for(intj=0;j<power.length;j++){ if(i==j){ sum=sum+bit[i]*power[j]; } } } returnsum; } /** *将和值与11取模得到余数进行校验码判断 * *@paramcheckCode *@paramsum17 *@return校验位 */ publicStringgetCheckCodeBySum(intsum17){ StringcheckCode=null; switch(sum17%11){ case10: checkCode="2"; break; case9: checkCode="3"; break; case8: checkCode="4"; break; case7: checkCode="5"; break; case6: checkCode="6"; break; case5: checkCode="7"; break; case4: checkCode="8"; break; case3: checkCode="9"; break; case2: checkCode="x"; break; case1: checkCode="0"; break; case0: checkCode="1"; break; } returncheckCode; } /** *将字符数组转为整型数组 * *@paramc *@return *@throwsNumberFormatException */ publicint[]converCharToInt(char[]c)throwsNumberFormatException{ int[]a=newint[c.length]; intk=0; for(chartemp:c){ a[k++]=Integer.parseInt(String.valueOf(temp)); } returna; } publicstaticvoidmain(String[]args)throwsException{ Stringidcard15="142431199001145";//15位 Stringidcard18="121212121212121212";//18位 IdcardValidatoriv=newIdcardValidator(); System.out.println(iv.isValidatedAllIdcard(idcard15)); System.out.println(iv.isValidatedAllIdcard(idcard18)); } }
根据身份证号提取身份证相关信息
importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; importjava.util.GregorianCalendar; importjava.util.HashMap; importjava.util.Map; importjava.util.Set; /** *<p> *类说明:提取身份证相关信息 *</p> */ publicclassIdcardInfoExtractor{ //省份 privateStringprovince; //城市 privateStringcity; //区县 privateStringregion; //年份 privateintyear; //月份 privateintmonth; //日期 privateintday; //性别 privateStringgender; //出生日期 privateDatebirthday; privateMap<String,String>cityCodeMap=newHashMap<String,String>(){ { this.put("11","北京"); this.put("12","天津"); this.put("13","河北"); this.put("14","山西"); this.put("15","内蒙古"); this.put("21","辽宁"); this.put("22","吉林"); this.put("23","黑龙江"); this.put("31","上海"); this.put("32","江苏"); this.put("33","浙江"); this.put("34","安徽"); this.put("35","福建"); this.put("36","江西"); this.put("37","山东"); this.put("41","河南"); this.put("42","湖北"); this.put("43","湖南"); this.put("44","广东"); this.put("45","广西"); this.put("46","海南"); this.put("50","重庆"); this.put("51","四川"); this.put("52","贵州"); this.put("53","云南"); this.put("54","西藏"); this.put("61","陕西"); this.put("62","甘肃"); this.put("63","青海"); this.put("64","宁夏"); this.put("65","新疆"); this.put("71","台湾"); this.put("81","香港"); this.put("82","澳门"); this.put("91","国外"); } }; privateIdcardValidatorvalidator=null; /** *通过构造方法初始化各个成员属性 */ publicIdcardInfoExtractor(Stringidcard){ try{ validator=newIdcardValidator(); if(validator.isValidatedAllIdcard(idcard)){ if(idcard.length()==15){ idcard=validator.convertIdcarBy15bit(idcard); } //获取省份 StringprovinceId=idcard.substring(0,2); Set<String>key=this.cityCodeMap.keySet(); for(Stringid:key){ if(id.equals(provinceId)){ this.province=this.cityCodeMap.get(id); break; } } //获取性别 Stringid17=idcard.substring(16,17); if(Integer.parseInt(id17)%2!=0){ this.gender="男"; }else{ this.gender="女"; } //获取出生日期 Stringbirthday=idcard.substring(6,14); Datebirthdate=newSimpleDateFormat("yyyyMMdd") .parse(birthday); this.birthday=birthdate; GregorianCalendarcurrentDay=newGregorianCalendar(); currentDay.setTime(birthdate); this.year=currentDay.get(Calendar.YEAR); this.month=currentDay.get(Calendar.MONTH)+1; this.day=currentDay.get(Calendar.DAY_OF_MONTH); } }catch(Exceptione){ e.printStackTrace(); } } /** *@returntheprovince */ publicStringgetProvince(){ returnprovince; } /** *@returnthecity */ publicStringgetCity(){ returncity; } /** *@returntheregion */ publicStringgetRegion(){ returnregion; } /** *@returntheyear */ publicintgetYear(){ returnyear; } /** *@returnthemonth */ publicintgetMonth(){ returnmonth; } /** *@returntheday */ publicintgetDay(){ returnday; } /** *@returnthegender */ publicStringgetGender(){ returngender; } /** *@returnthebirthday */ publicDategetBirthday(){ returnbirthday; } @Override publicStringtoString(){ return"省份:"+this.province+",性别:"+this.gender+",出生日期:" +this.birthday; } publicstaticvoidmain(String[]args){ Stringidcard="121212121212121212"; IdcardInfoExtractorie=newIdcardInfoExtractor(idcard); System.out.println(ie.toString()); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。