C#:18位身份证号码校验

/* ----------------------------------------------------------
 * 文件名称:IDCard.cs
 * 作者:秦建辉
 * 
 * QQ:36748897
 * 
 * 博客:http://www.firstsolver.com/wordpress/
 * 
 * 开发环境:
 *      Visual Studio V2012
 *      .NET Framework 4.5
 *      
 * 版本历史:
 *      V1.0	2013年06月20日
 *              完成身份证号码校验
------------------------------------------------------------ */
using System;

namespace Splash.Util
{
    public class IDCard
    {
        /// <summary>
        /// 验证身份证号码
        /// </summary>
        /// <param name="IdCardNumber">要验证的身份证号码</param>
        /// <param name="Gender">性别 0:不校验 1:男性 2:女性</param>
        /// <returns>
        ///     true:号码校验通过
        ///     false:号码校验失败
        /// </returns>
        /// <remarks>
        /// 参考资料:http://baike.baidu.com/view/5112521.htm
        /// 身份证最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的
        /// 第17位,奇数表示男性,偶数表示女性
        /// </remarks>
        public static Boolean VerifyIdCardNumber(String IdCardNumber, Int32 Gender = 0)
        {
            const Int32 IdCardNumberLength = 18;    // 身份证号码长度18位
            if (String.IsNullOrEmpty(IdCardNumber) || IdCardNumber.Length != IdCardNumberLength) return false;

            try
            {
                // 检测月份 1~12
                Int32 Month = Convert.ToInt32(IdCardNumber.Substring(10, 2));
                if (Month < 1 || Month > 12) return false;

                // 检测日期 1~31
                Int32 Day = Convert.ToInt32(IdCardNumber.Substring(12, 2));
                if (Day < 1 || Day > 31) return false;

                // 判断性别
                if (Gender == 1)
                {   // 男性,奇数为男
                    if (Convert.ToInt32(IdCardNumber.Substring(16, 1)) % 2 == 0) return false;
                }
                else if (Gender == 2)
                {   // 女性,偶数为女
                    if (Convert.ToInt32(IdCardNumber.Substring(16, 1)) % 2 != 0) return false;
                }
            }
            catch (Exception)
            {
                return false;
            }

            // 验证末位的校验码
            Byte[] Weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            Int32 Sum = 0;
            for (Int32 i = 0; i < IdCardNumberLength - 1; i++)
            {
                Char ch = IdCardNumber[i];
                if (!Char.IsDigit(ch)) return false;    // 是否为数字字符
                Sum += (ch - '0') * Weight[i];
            }

            Int32 Remainder = Sum % 11;
            if (Remainder == 2)
            {
                if (Char.ToLower(IdCardNumber[IdCardNumberLength - 1]).Equals('x')) return true; else return false;
            }
            else
            {
                if (IdCardNumber[IdCardNumberLength - 1] - '0' == (12 - Remainder) % 11) return true; else return false;
            }
        }
    }
}

Comments are closed.