前言:之前在项目开发中,经常需要用户录入身份证信息,同时还要提供籍贯等信息。那么,如何从身份证号码中解析出籍贯等信息,就是本篇博客索要解决的。
其实,身份证号码前6位就是用户的籍贯编码,直接解析该6位号码就可以了。但是问题来了,前6位中的每2位,分别代表省、市、区编码,如何能够通过编码获取该编码对应的名称?这里面的信息量,估计没有几个愿意根据国标录完之后在进行比较的(太多)。后面,在项目的省市区三级联动插件中,发现了,里面有一个js文件,该文件中,就包含有全部的信息。那么我们直接解析这个文件就可以了。
另外,之前项目使用的前端校验是jQuery Validate,这个解析操作,应该在号码通过校验后,在进行解析。直接上代码
function idCardInfoResolver(idCardNumber) { var district = idCardNumber.substr(0 , 6); var province = district.substr(0 , 2) + "0000"; var city = district.substr(0 , 4) + "00"; //省份解析 var provinceName = getCodeNameThroughCodeNumber('86' , province); if(provinceName == "error") { toastr.error("无法从当前输入的身份证编号中解析得到对应的身份信息" , "身份证信息解析"); return false; } //市解析 var cityName = getCodeNameThroughCodeNumber(province , city); if(cityName == "error") { toastr.error("无法从当前输入的身份证编号中解析得到对应的省份信息" , "身份证信息解析"); return false; } //区解析 var districtName = getCodeNameThroughCodeNumber(city , district); if(districtName == "error") { toastr.error("无法从当前输入的身份证编号中解析得到对应的区信息" , "身份证信息解析"); return false; } var birthDay = ""; if(idCardNumber.length == 15) { birthDay = "19" + idCardNumber.substr(6 , 12); } else if(idCardNumber.length == 18) { birthDay = idCardNumber.substr(6 , 14); } birthDay = birthDay.substr(0 , 4) + "年" + birthDay.substr(4 , 2) + "月" + birthDay.substr(6 , 2) + "日"; var sex = parseInt(idCardNumber.substr(idCardNumber.length - 2 , 1)); alert(sex); if(sex % 2 == 0) { sex = "女"; } else { sex = "男"; } $("#province").val(provinceName); $("#province").change(); $("#city").val(cityName); $("#city").change(); $("#district").val(districtName); $("#district").change(); $("#bornDate").val(birthDay); $("#sex").val(sex); }
function getCodeNameThroughCodeNumber(code , codeNumber) { var addressName = "error"; $.each(ChineseDistricts[code] , function(cd , address) { if(cd == codeNumber) { addressName = address; return false; } }); return addressName; }
上述代码完成籍贯、出生日期以及性别信息的解析操作,看一下效果。
解析前:
解析后