18位身份证号码检验JS脚本函数修正

function CheckIDCard(StrNumber)
{
//判断身份证号码格式函数
//公民身份号码是特征组合码,
//排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码

//身份证号码长度判断
if(StrNumber.length<15||StrNumber.length==16||StrNumber.length==17||StrNumber.length>18)
{
alert("填写的身份证号码长度不正确,请重新填写!");
return false;
}
//身份证号码最后一位可能是超过100岁老年人的X.X也可以代表是阿拉伯数字10的意思
//所以排除掉最后一位数字进行数字格式测试,最后一位数字有最后一位数字的算法

var Ai;
if(StrNumber.length==18)
{
Ai = StrNumber.substring(0,17);
}
else
{
Ai =StrNumber.substring(0,6)+"19"+StrNumber.substring(6,9);
}
//调用数字判断函数IsNumeric()
if(IsNumeric(Ai)==false)
{
alert("身份证号码数字字符串不正确,请重新填写!");
return false;
}

var strYear,strMonth,strDay,strBirthDay;
strYear = parseInt(Ai.substr(6,4));
strMonth = parseInt(Ai.substr(10,2)) ;
strDay = parseInt(Ai.substr(12,2));
//调用日期判断函数IsValidDate()
if (IsValidDate(strYear,strMonth,strDay)==false)
{
alert("身份证号码"+Ai+"日期格式年份"+strYear+"月份"+strMonth+"日"+strDay+"不正确,请重新填写!");
return false;
}

var arrVerifyCode = new Array("1","0","x","9","8","7","6","5","4","3","2");
var Wi = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
var k,TotalmulAiWi=0;
for (k=0; k<17;k++)
 {
 TotalmulAiWi = TotalmulAiWi + parseInt(Ai.substr(k,1)) * Wi[k];
 
  }
//alert("身份证号码最后一位的识别码是:"+TotalmulAiWi);
var modValue =TotalmulAiWi % 11 ;
var strVerifyCode = arrVerifyCode[modValue];
Ai = Ai+strVerifyCode;
//alert("身份证号码"+StrNumber+"与正确的号码"+Ai+"一致!");
if((StrNumber.length==18)&&(StrNumber!=Ai))
{
alert("身份证号码"+StrNumber+"与正确的号码"+Ai+"不一致,请重新填写!");
return false;
}
return true;

}
//数字判断函数IsNumeric()
function IsNumeric(oNum)
{
  if(!oNum) return false;
  var strP=/^/d+(/./d+)?$/;
  if(!strP.test(oNum)) return false;
  try{
  if(parseFloat(oNum)!=oNum) return false;
  }
  catch(ex)
  {
   return false;
  }
  return true;
}
//有效年份判断函数IsValidYear()
function IsValidYear(psYear)
{
    var sYear = new String(psYear);

    if(psYear==null)
    {
        alert("身份证号码出生日期中年份为Null,请重新填写!");
  return false;
    }


    if(isNaN(psYear)==true)
    {
        alert("身份证号码出生日期中年份必须为数字,请重新填写!");
  return false;
    }

    if(sYear == "")
    {
  alert("身份证号码出生日期中年份为空,请重新填写!");
        return true;
    }

    if(sYear.match(/[^0-9]/g)!=null)
    {
        alert("身份证号码出生日期中年份必须为0-9之间的数字组成,请重新填写!");
  return false;
    }

    var nYear = parseInt(sYear,10);

    if((nYear < 0) || (9999 < nYear))
    {
        alert(nYear +"身份证号码出生日期中年份必须为正常的正整数,请重新填写!");
  return false;
    }

    return true;
}

//有效月份判断函数IsValidMonth()
function IsValidMonth(psMonth)
{
    var sMonth = new String(psMonth);

    if(psMonth==null)
    {
        return false;
    }

    if(isNaN(psMonth)==true)
    {
        return false;
    }

    if(sMonth == "")
    {
        return true;
    }

    if(sMonth.match(/[^0-9]/g)!=null)
    {
        return false;
    }

    var nMonth = parseInt(sMonth,10);

    if((nMonth < 0) || (12 < nMonth))
    {
        return false;
    }

    return true;
}

//有效日判断函数IsValidDay()
function IsValidDay(psDay)
{
    var sDay  = new String(psDay);

    if(psDay==null)
    {
        return false;
    }

    if(isNaN(psDay)==true)
    {
        return false;
    }

    if(sDay == "")
    {
        return true;
    }

    if(sDay.match(/[^0-9]/g)!=null)
    {
        return false;
    }

    var nDay = parseInt(psDay, 10);

    if((nDay < 0) || (31 < nDay))
    {
        return false;
    }

    return true;
}

//有效日期判断函数IsValidDate()
function IsValidDate(psYear, psMonth, psDay)
{
    if(psYear==null || psMonth==null || psDay==null)
    {
        return false;
    }

    var sYear  = new String(psYear);
    var sMonth = new String(psMonth);
    var sDay   = new String(psDay);

    if(IsValidYear(sYear)==false)
    {
        return false;
    }

    if(IsValidMonth(sMonth)==false)
    {
        return false;
    }

    if(IsValidDay(sDay)==false)
    {
        return false;
    }

    var nYear  = parseInt(sYear,  10);
    var nMonth = parseInt(sMonth, 10);
    var nDay   = parseInt(sDay,   10);

    if(sYear=="" &&  sMonth=="" && sDay=="")
    {
        return true;
    }

    if(sYear=="" || sMonth=="" || sDay=="")
    {
        return false;
    }
  
    if(nMonth < 1 || 12 < nMonth)
    {
        return false;
    }
    if(nDay < 1 || 31 < nDay)
    {
        return false;
    }

    if(nMonth == 2)
    {
        if((nYear % 400 == 0) || (nYear % 4 == 0) && (nYear % 100 != 0))
        {
            if((nDay < 1) || (nDay > 29))
            {
                return false;
            }
        }
        else
        {
            if((nDay < 1) || (nDay > 28))
            {
                return false;
            }
        }
    }
    else if((nMonth == 1)  ||
            (nMonth == 3)  ||
            (nMonth == 5)  ||
            (nMonth == 7)  ||
            (nMonth == 8)  ||
            (nMonth == 10) ||
            (nMonth == 12))
    {
        if((nDay < 1) || (31 < nDay))
        {
            return false;
        }
    }
    else
    {
        if((nDay < 1) || (30 < nDay))
        {
            return false;
        }
    }

    return true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疾风铸境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值