js实现批量生成18位身份证号码
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>批量生成18位身份证号码</title> <script language="JavaScript"> <!-- var areaCode = { '43':'湖南省','4324':'湖南省XX市', '432427':'湖南省XX市XX县' } /**删除左右两端的空格**/ function trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } /**根据15位身份证或者18位身份证的前17位生成18位身份证号码*/ function getCheckID(_pid) { var arrVerifyCode = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2]; var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; if (_pid.length != 15 && _pid.length != 17) return(false); var ai = (_pid.length == 17) ? _pid : _pid.substr(0,6) + "19" + _pid.substr(6); if (!/^\d+$/.test(ai)) return(false); var yyyy = ai.substr(6, 4), mm = ai.substr(10, 2) - 1, dd = ai.substr(12, 2); var d = new Date(yyyy,mm,dd), year = d.getFullYear(), mon = d.getMonth(), day = d.getDate(), now = new Date(); if (year != yyyy || mon != mm || day != dd || d > now || now.getFullYear() - year > 140) return(false); for(var i = 0, ret = 0; i < 17; i++) ret += ai.charAt(i) * wi[i]; ai += arrVerifyCode[ret %= 11]; return(ai); } /**判断输入的15位或者18位身份证号码是否合法*/ function ParseID(pId) { var arrVerifyCode = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2]; var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; if (pId.length != 15 && pId.length != 18) return("身份证号码只能是15位或18位!"); var ai = (pId.length == 18) ? pId.substr(0,17) : pId.substr(0,6) + "19" + pId.substr(6); if (!/^\d+$/.test(ai)) return("身份证除最后一位外,必须为数字!"); var yyyy = ai.substr(6, 4), mm = ai.substr(10, 2) - 1, dd = ai.substr(12, 2); var d = new Date(yyyy,mm,dd), year = d.getFullYear(), mon = d.getMonth(), day = d.getDate(), now = new Date(); if (year != yyyy || mon != mm || day != dd || d > now || now.getFullYear() - year > 140) return("身份证出生年月日输入错误!"); for(var i = 0, ret = 0; i < 17; i++) ret += ai.charAt(i) * wi[i]; ai += arrVerifyCode[ret %= 11]; return ((pId.length == 18 && pId.toLowerCase() != ai) ? "身份证输入错误,正确的为\n" + ai + "!" : ai); } /**根据身份证取 省份,生日,性别*/ function getInfo(pid) { _id = ParseID(pid) if (isNaN(_id.substr(0, 17))) return "错误的身份证号码" var _id = String(_id), sex = _id.substr(17, 1) % 2 ? "女" : "男"; prov = areaCode[_id.substr(0,6)] || areaCode[_id.substr(0,4)] || areaCode[_id.substr(0,2)] || "无法确定"; var birthday = (new Date(_id.substr(6,4), _id.substr(10,2) - 1, _id.substr(12,2))).toLocaleDateString() return [prov,birthday,sex]; } /**生成一定范围的随机数*/ function fRandomBy(under, over){ switch(arguments.length){ case 1: return parseInt(Math.random() * under+1); case 2: return parseInt(Math.random() * (over-under+1) + under); default: return 0; } } /**随机生成一个身份证*/ function RandomCreateID() { function _RandomCreateID() { var aid = 432427, ac = null, yyyy = 0, mm = 0, dd = 0, rnd = 0; yyyy = fRandomBy(1940,1990), mm = fRandomBy(1,12), dd = fRandomBy(1,31); rnd = fRandomBy(1,999); mm = (mm < 10) ? ("0" + mm) : mm; dd = (dd < 10) ? ("0" + dd) : dd; return("" + aid + yyyy + mm + dd + rnd); } var ff = false; //如果生成的身份证校验不通过,则再生成,直到校验通过为止 while (!ff) { ff = getCheckID(_RandomCreateID()); } return(ff); } /**批量生成身份证*/ function createid() { var count = document.getElementById("txt"); var cnt = count.value; var info = document.getElementById("info"); info.innerHTML = ""; cnt = trim(cnt); if (!isNaN(cnt)) { cnt = cnt < 0 ? cnt = 10 : cnt; cnt = cnt > 200 ? cnt = 100 : cnt; for (i = 0; i < cnt; i++) { var t = RandomCreateID(); info.innerHTML += "<font color=\"#9900FF\">" + t + "</font> " + getInfo(t) + "<br>"; } } else { info.innerHTML = "<font color=\"#FF0000\">不是数字!</font>"; } count.focus; count.select(); } //--> </script> </head> <body> 使用说明:<br> 在“数量”中输入阿拉伯数字,点击“生成”,可以生成数量个随机身份证号码! <hr> <div id="query" align="center"> 数量:<input id="txt" type="text" name="qrytxt" size="20"> <br> <br> <input type="button" value="生成" name="btncreate" onclick="createid()"> <hr> <div id="info" align="left"> </div> </div> </body> </html>
说明
1.isNaN()函数可用于判断其参数是否是 NaN,该值表示一个非法的数字(比如被 0 除后得到的结果)。如果把 NaN 与任何值(包括其自身)相比得到的结果均是 false,所以要判断某个值是否是 NaN,不能使用 == 或 === 运算符。
2.校验身份证上的号码是否正确,是获得身份证上的年、月、日做为Date的入参,得到一个日期,再比较这两个日期的年、月、日是否相等。
3.当然,这里还校验了出生日期不能是140年以前,因为好像还没有人寿命达到或超过140岁。
4.获得地区(省、市、区/县)在生产系统中,应该是通过基础数据获得。
5.根据身份证取省份、生日、性别信息前对身份证号码的合法性校验,在这里可以不要,因为在前面的逻辑中有校验。但从模块功能来讲,是有必要的。