身份证号码有效性检测算法 ( js版 转 C#版 )

转载 2018年01月06日 00:00:00

C#版


#region 检测是否是正确的身份证

        /// <summary>

        /// 身份证验证

        /// </summary>

        /// <param name="num"></param>

        /// <returns></returns>

        public static bool isIdCardNo(string cardid)

        {

            string num = cardid.ToUpper();

            int[] factorArr = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };

            char[] parityBit = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

            char[] varArray = new char[18];

            var lngProduct = 0;

            int intCheckDigit = 0;

            var intStrLen = num.Length;

            var idNumber = num;

            // initialize

            if ((intStrLen != 15) && (intStrLen != 18))

            {

                return false;

            }

            // check and set value


            for (int i = 0; i < intStrLen; i++)

            {

                varArray[i] = (char)Convert.ToInt32(idNumber[i]);

                if (((varArray[i] - 48) < 0 || (varArray[i] - 48) > 9) && (i != 17))

                {

                    return false;

                }

                else if (i < 17)

                {

                    varArray[i] = (char)((varArray[i] - 48) * factorArr[i]);

                }

            }

            if (intStrLen == 18)

            {

                //check date

                var date8 = idNumber.Substring(6, 8);

                if (isDate8(date8) == false)

                {

                    return false;

                }

                // calculate the sum of the products

                for (int i = 0; i < 17; i++)

                {

                    lngProduct = lngProduct + varArray[i];

                }

                // calculate the check digit

                intCheckDigit = parityBit[lngProduct % 11];

                // check last digit

                if (varArray[17] != intCheckDigit)

                {

                    return false;

                }

            }

            else

            {        //length is 15

                //check date

                var date6 = idNumber.Substring(6, 6);

                if (isDate6(date6) == false)

                {

                    return false;

                }

            }

            return true;

        }


        /// <summary>

        /// 15位身份证日期检测--年/月--6位

        /// </summary>

        /// <param name="sDate"></param>

        /// <returns></returns>

        static bool isDate6(string sDate)

        {

            if (!Regex.IsMatch(sDate, "^[0-9]{6}$"))

            {

                return false;

            }

            int year, month;

            year = Convert.ToInt32(sDate.Substring(0, 4));

            month = Convert.ToInt32(sDate.Substring(4, 2));

            if (year < 1700 || year > 2500) return false;

            if (month < 1 || month > 12) return false;

            return true;

        }


        /// <summary>

        /// 18位身份证日期检测--年/月/日--8位

        /// </summary>

        /// <param name="sDate"></param>

        /// <returns></returns>

        static bool isDate8(string sDate)

        {

            if (!Regex.IsMatch(sDate, "^[0-9]{8}$"))

            {

                return false;

            }

            int year, month, day;

            year = Convert.ToInt32(sDate.Substring(0, 4));

            month = Convert.ToInt32(sDate.Substring(4, 2));

            day = Convert.ToInt32(sDate.Substring(6, 2));

            int[] iaMonthDays = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

            if (year < 1700 || year > 2500) return false;

            if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;

            if (month < 1 || month > 12) return false;

            if (day < 1 || day > iaMonthDays[month - 1]) return false;

            return true;

        }

        #endregion


二、JS版


function isIdCardNo(num) {

    var factorArr = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);

    var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");

    var varArray = new Array();

    var intValue;

    var lngProduct = 0;

    var intCheckDigit;

    var intStrLen = num.length;

    var idNumber = num;

    // initialize

    if ((intStrLen != 15) && (intStrLen != 18)) {

        return false;

    }

    // check and set value

    for (i = 0; i < intStrLen; i++) {

        varArray[i] = idNumber.charAt(i);

        if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {

            return false;

        } else if (i < 17) {

            varArray[i] = varArray[i] * factorArr[i];

        }

    }

    if (intStrLen == 18) {

        //check date

        var date8 = idNumber.substring(6, 14);

        if (isDate8(date8) == false) {

            return false;

        }

        // calculate the sum of the products

        for (i = 0; i < 17; i++) {

            lngProduct = lngProduct + varArray[i];

        }

        // calculate the check digit

        intCheckDigit = parityBit[lngProduct % 11];

        // check last digit

        if (varArray[17] != intCheckDigit) {

            return false;

        }

    }

    else {        //length is 15

        //check date

        var date6 = idNumber.substring(6, 12);

        if (isDate6(date6) == false) {

            return false;

        }

    }

    return true;

}

function isDate6(sDate) {

    if (!/^[0-9]{6}$/.test(sDate)) {

        return false;

    }

    var year, month, day;

    year = sDate.substring(0, 4);

    month = sDate.substring(4, 6);

    if (year < 1700 || year > 2500) return false

    if (month < 1 || month > 12) return false

    return true

}

/**

* 判断是否为“YYYYMMDD”式的时期

*

*/

function isDate8(sDate) {

    if (!/^[0-9]{8}$/.test(sDate)) {

        return false;

    }

    var year, month, day;

    year = sDate.substring(0, 4);

    month = sDate.substring(4, 6);

    day = sDate.substring(6, 8);

    var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    if (year < 1700 || year > 2500) return false

    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;

    if (month < 1 || month > 12) return false

    if (day < 1 || day > iaMonthDays[month - 1]) return false

    return true

}


身份证号码有效性检测

身份证号码有效性检测在开发软件的时候有些注册需要身份证号等信息,并且要求号码的正确性。简单的身份证号码有效性检测 - (BOOL)verifyIdentityCardNum { NSStrin...
  • baidu_15100009
  • baidu_15100009
  • 2017年03月21日 16:23
  • 285

A*算法JS版本

提供一个A*寻径算法的源码+DEMO,做WEB游戏很有用。下面是DEMO:use A* to find path...    //地图宽高    var w=30,h=20;        //地图数...
  • cloudandy
  • cloudandy
  • 2007年12月16日 20:51
  • 612

js 验证身份证号码正确性

今天找半天js验证身份证的,从网上找了很多,自己也总结了一下,在此记录,以便以后使用查询方便,也供大家参考。 代码如下,可直接用身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最...
  • zl541907196
  • zl541907196
  • 2013年11月21日 21:00
  • 3711

C#验证身份证是否有效

转自:中国身份证号码验证 #region 验证身份证 public static bool CheckIDCard(string Id) { ...
  • f10_s
  • f10_s
  • 2013年12月26日 10:56
  • 2608

C# 15位身份证号码转18位算法实现

转换类: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System....
  • zlb168
  • zlb168
  • 2011年03月12日 11:01
  • 2062

C# 验证URL有效性

TEST 这篇日志,是直接从OneNote 2010里面发送到CSDN上去的!! 发送接口如下: http://blog.csdn.net/jxitc/services/metablogapi.a...
  • jxitc
  • jxitc
  • 2011年01月18日 05:08
  • 3052

C#识别身份证号码(经典版)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin...
  • lucky51222
  • lucky51222
  • 2015年10月17日 22:14
  • 3017

18位身份证号验证算法的原理以及C#实现和在管理系统的应用

本博文介绍一下我自主开发的企业工资管理系统中关于员工18身份证号合法性验证的原理以及采用C#实现的代码、在实际的管理系统中应用!...
  • u013871100
  • u013871100
  • 2016年07月10日 00:16
  • 1967

中国大陆身份证号码有效性验证

package test; import java.text.SimpleDateFormat; import java.util.Date; /** * 身份证号码,可以解析身份证...
  • wxl3105
  • wxl3105
  • 2011年11月24日 00:27
  • 4612

把15位身份证转成18位的JS代码

原文地址:http://www.java2000.net/p11027网友提供的一段代码。html>head>title>把15位身份证转成18title>script language="javas...
  • java2000_net
  • java2000_net
  • 2008年10月20日 19:28
  • 4474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:身份证号码有效性检测算法 ( js版 转 C#版 )
举报原因:
原因补充:

(最多只允许输入30个字)