`

身份证号码校验

阅读更多
第一个校验来自于学长:
function isIdCardNo(num) {
// 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。       
    num = num.toUpperCase();
    // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
    if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {    
        alert("输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。");             
        return false;        
    }
    // 下面分别分析出生日期和校验位
    var len;
    var re;
    len = num.length;
    if (len == 15) {
        re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
        // 检查生日日期是否正确
        var arrSplit = num.match(re);
        var dtmBirth = new Date("19" + arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {        
            alert("输入的身份证号里出生日期不对!");           
            return false;
        } else {
        // 将15位身份证转成18位 ,校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。     
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            var nTemp = 0;
            num = num.substr(0, 6) + "19" + num.substr(6, num.length - 6);
            for(var i = 0; i < 17; i ++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            num += arrCh[nTemp % 11];
            return true;
        }
    }
    // 身份证ID为18为的时候
    if (len == 18) {
        re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
        // 检查生日日期是否正确
        var arrSplit = num.match(re);
        var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
        var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
            alert("输入的身份证号里出生日期不对!");
            return false;
        }
        else {
        // 检验18位身份证的校验码是否正确。  校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
            var valnum;
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            var nTemp = 0;
            for(var i = 0; i < 17; i ++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            valnum = arrCh[nTemp % 11];
            if (valnum != num.substr(17, 1)) {
                alert("18位身份证的校验码不正确!末位应该为:" + valnum);
                return false;
            }
            return true;
        }
    }
    return false;
}

第二个校验来自于项目中:
function gf_check_identity(as_identity) {

var ls_identity_no;
var ls_year,ls_month,ls_day,ls_date;
var ls_today;
var ll_year;
var ll_identity_no_len;

ls_identity_no = as_identity;
ls_today = new Date();
ls_current = ls_today.getYear()+'/'+(ls_today.getMonth()+1)+'/'+ls_today.getDate();

ll_identity_no_len=ls_identity_no.length;

if (/^\s*$/.test(ls_identity_no) ) {
alert("身份证号码不能为空!");
return false;
}
else if (!(ll_identity_no_len==15 || ll_identity_no_len == 18))
{
alert("身份证号码位数不正确,请检查输入情况!");
return false;


//alert('length==' + ll_identity_no_len);
if (ll_identity_no_len == 15) { //身份证为 15 处理,  认为15位的年 = 19**
// alert("YYYYYYYYYYYYYY");
ls_year = ls_identity_no.substring(6,8);
ls_month = ls_identity_no.substring(8,10);
ls_day = ls_identity_no.substring(10,12);
ls_year = '19' + ls_year//year is only 20 century
ls_date = ls_year +'/' + ls_month +'/' + ls_day;
}
else {
// alert("XXXXXXXXXXXXX");
ls_year = ls_identity_no.substring(6,10);
if  (!(ls_year.substring(0,2) == '19' || ls_year.substring(0,2)== '20')){
  alert("身份证号码中的出生年份不正确, 请您重新输入!");
  return false;
}

ls_month = ls_identity_no.substring(10,12);
ls_day =  ls_identity_no.substring(12,14);
ls_date = ls_year +'/' + ls_month +'/' + ls_day
}

//alert('ls_month==' + ls_month);
if (ls_month > '12') {
alert("身份证号码中的出生月份不能大于12, 请您重新输入 ");
return false;
}
else if (ls_month <= '00') {
alert("身份证号码中的出生月份不能小于01, 请您重新输入 ");
return false;
}

if  (ls_day <= '00')  {
alert("身份证号码的出生日小于01, 请您重新输入 ");
return false;
}

switch (ls_month) {
case '01'://大月的处理
case '03':
case '05':
case '07':
case '08':
case '10':
case '12':
  if (ls_day > '31') {
   alert("身份证号码的出生日大于31, 请您重新输入");
   return false;
}
break;

case '04': //小月的处理
case '06':
case '09':
case '11':
  if  (ls_day > '30' ) {
  alert("身份证号码的出生日大于30(本月无31日), 请您重新输入");
  return false;
  }
  break;
 
case '02': //平年和闰年的处理
  ll_year = parseInt(ls_year); 
  if ((ll_year%4== 0 && ll_year%100!=0) || ll_year%400==0) {   //闰年,二月份不能多于29天
   if (ls_day > '29') {
alert("闰年的二月份没有" + ls_day + "日,请重新输入出生日期");
return fasle;
   }
  }
  else {//平年二月份不能大于28天
   if (ls_day > '28') {
alert("平年的二月份没有" + ls_day + "日,请重新输入出生日期");
return false;
   }
}
}

if (Date.parse(ls_date) > Date.parse(ls_current)) {
alert("身份证号码的出生日期小于登记日期,不合理请您重新输入");
return false;
}


if (ll_identity_no_len == 18) {//18位的校验码的检验
  var lastS = ls_identity_no.substring(ls_identity_no.length-1,ls_identity_no.length);
  var code = getVertifyCode(ls_identity_no.substring(0,17));
  if (lastS!=code)
  {
  alert("身份证检验码不正确,请您重新输入");
  return false;
  }
}

return true;
}

/**
取得18位身份证号码的检验码,入参为身份证号码前17位
*/
function getVertifyCode(identify) {
var factors = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4, 2];
var codes = ['1','0','X','9','8','7','6','5','4','3','2'];

var sum = 0;
var temp = 0;
for (var j=0; j<factors.length; j++)
{
temp = parseInt(identify.charAt(j)+"")*factors[j];
sum +=  temp;
}

var re = sum%11;
return codes[re];
}



第一种方式校验身份证中的日期采用的正则表达式,第二种方式用的JS判断的。
分享到:
评论

相关推荐

    oracle 身份证号码校验函数

    Oracle身份证号码校验函数,可以将15位身份号码升为18位,检验出生年月等信息

    JAVA验证身份证号码校验码是否正确.zip

    身份证号码是中国公民重要的个人身份标识,它包含了个人的出生日期和地区的编码信息,并且通过一个校验码来确保号码的准确性。在Java编程中,验证身份证号码的校验码是否正确是一项常见的任务,特别是在处理个人信息...

    C++身份证号码校验

    根据给定的信息,我们可以深入探讨有关“C++身份证号码校验”的知识点,包括身份证号码的结构、校验方法以及如何使用C++语言实现这一过程。 ### 一、身份证号码的基本结构 身份证号码由18位数字组成,按照以下规则...

    JAVA身份证号码校验类

    针对身份证号码的校验,以及能自动将身份证从15位升级为18位

    java写的身份证号码校验类

    ### Java实现的身份证号码校验类详解 #### 一、引言 身份证号码是中国公民的唯一标识符,具有很高的安全性和唯一性。在中国大陆地区,身份证号码由18位数字组成,其中最后一位用于校验整个身份证号码的有效性。...

    C#实现身份证号码校验

    在IT行业中,身份证号码校验是一项常见的需求,尤其是在涉及到个人信息处理的应用中。本文将深入探讨如何使用C#语言实现这一功能。C#是一种强大的、面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,...

    身份证号码校验程序.exe

    可以校验15位和18位的身份证号码。 如果输入的18位身份证号码有错,将自动改为正确的号码。

    身份证号码校验+解析源码

    在这个话题中,我们将深入探讨身份证号码的结构、校验原理以及如何进行有效性校验。 身份证号码通常由18位数字组成,分为以下几个部分: 1. 地区代码(6位):前6位表示持证人的户籍所在地,按照国家标准《GB/T ...

    Excel 身份证号码校验 年龄 性别提取 银行卡数字校验

    身份证和银行卡号码的最后一位都是用前面的数字计算而来的校验码,所以可以在一定程度上减少误输入的可能。 此文件包含身份证、19位银行卡号码校验,年龄提取,性别提取的公式。 使用方式,非常简单,打开此文件,...

    身份证号码校验(PB源码)

    `f_get_sfzvalid.srf` 和 `f_get_sfz_validbh.srf` 这两个文件很可能就是包含身份证校验功能的SRF文件,其中`f_get_sfzvalid`和`f_get_sfz_validbh`可能是函数的名字,分别对应不同的校验逻辑。 身份证校验通常涉及...

    免费小型身份证校验接口

    身份证校验接口是一种专门用于验证身份证号码真实性的网络服务。在本案例中,该接口通过发送HTTP请求至特定URL(如`https://shenfen.supfree.net/search.asp?id=身份证号`),来检查身份证号码的有效性。这种接口...

    身份证号码校验位的计算方法

    这篇文章将详细讲解身份证号码校验位的计算方法,并结合Delphi编程语言,介绍如何编写一个身份证号码校验工具。 身份证号码由18位数字组成,前17位分别代表出生年月日、性别、出生顺序号和区域代码。第18位是校验位...

    Excel自定义函数_身份证号码校验

    在Excel中进行身份证号码校验是一项常见的数据验证工作,尤其在处理大量个人数据时显得尤为重要。ExcelDNA是一种强大的工具,它允许用户创建自定义的Excel函数,这些函数可以利用.NET Framework的强大功能,使得...

    身份证号码校验算法描述

    ### 身份证号码校验算法详解 #### 一、身份证号码概述与规范 中国的身份证号码自1999年7月1日起正式实施GB11643-1999标准,该标准取代了之前的GB11643-1989版本。身份证号码由18位数字组成,每部分都有其特定的意义...

    一个有关身份证号码校验的JS代码

    一个有关身份证号码校验的JS代码,需要jquery支持。

    身份证号码校验.exe

    用C语言写的一个小工具,根据国标算法检验校验身份证号码真伪,只校验身份证号码,不检查信息。

    身份证号码批量校验软件idcheck

    《身份证号码批量校验软件idcheck详解》 在信息技术领域,身份证号码的验证是一项至关重要的工作,尤其是在数据处理、用户认证、信息安全等场景下。针对这一需求,一款名为"idcheck"的软件应运而生,它专注于18位...

    excel编写的身份证号码校验程序

    excel编写的身份证号码校验程序,只要将身份证号码与性填写到相应的表格项中就可知道身份证号码是否正确。注意使用时需要将execl中“工具”-“选项”-“安全性”-“宏安全性”设置为低才可以运行。

    身份证号码校验.docx

    "身份证号码校验.docx" 本文档主要讲解了 Windows 程序设计中的各种对话框、控件和图像处理技术。通过分析文档的目录和内容,我们可以总结出以下知识点: 1. 对话框应用程序的设计和实现,包括设置对话框应用程序...

    身份证号码校验的EXcel

    使用excel公式对身份证号的数值进行校验,判断指定身份证号是否正确。

Global site tag (gtag.js) - Google Analytics