前言:之前在項目開發中,經常需要用戶錄入身份證信息,同時還要提供籍貫等信息。那么,如何從身份證號碼中解析出籍貫等信息,就是本篇博客索要解決的。
其實,身份證號碼前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; }
上述代碼完成籍貫、出生日期以及性別信息的解析操作,看一下效果。
解析前:
解析后