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

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

}


posted @ 2018-01-06 00:00  天使不哭  阅读(202)  评论(0编辑  收藏  举报