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.根据身份证取省份、生日、性别信息前对身份证号码的合法性校验,在这里可以不要,因为在前面的逻辑中有校验。但从模块功能来讲,是有必要的。
