批量生成18位身份证号码

        由于在工作中,经常要求输入身份证号码,而通过手输的身份证很难通过合法性校验,因此项目组有同事共享了批量生成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.根据身份证取省份、生日、性别信息前对身份证号码的合法性校验,在这里可以不要,因为在前面的逻辑中有校验。但从模块功能来讲,是有必要的。

扫描二维码关注公众号,回复: 505636 查看本文章

猜你喜欢

转载自bijian1013.iteye.com/blog/2280894