/// <summary>
    /// 性别
    /// </summary>
    public enum enumIDCardSex
    {
        //女性
        Woman = 0,
        //男性
        Man = 1
    }

    /// <summary>
    /// 身份证检查工具
    /// </summary>
    public class IDCardCheckTool
    {
        //各省市地区国家代码前两位代码是:     
        //北京 11   吉林   22     福建 35   广东 44   云南 53   天津 12   黑龙江 23     
        //江西 36   广西   45     西藏 54   河北 13   上海 31   山东 37   海南   46
        //陕西 61   山西   14     江苏 32   河南 41   重庆 50   辽宁 21   安徽   34   
        //甘肃 62   内蒙古 15     浙江 33   湖北 42   四川 51   青海 63   湖南   43
        //贵州 52   宁夏   64     新疆 65   台湾 71   香港 81   澳门 82   国外   91

        /// <summary>
        /// 省份代码
        /// </summary>
        //private static IList<string> listProvice = new List<string> { 
        //    "11","22","35","44","53","12","23","36","45","54","13",
        //    "31","37","46","61","14","32","41","50","62","15","33",
        //    "42","51","63","21","34","43","52","64","65","71","81","82","91"};


        /// <summary>
        /// 检查身份证是否有效
        /// </summary>
        /// <param name="id">身份证号码</param>
        /// <param name="msg">返回消息</param>
        /// <returns></returns>
        public static bool CheckIDCardValid(string id, out string msg)
        {
            msg = string.Empty;
            bool ret = true;
            if (!CheckLength(id))
            {
                msg = "身份证号码长度不正确!";
                return false;
            }

            if (!CheckValidWords(id, out msg))
            {
                return false;
            }

            switch (id.Length)
            {
                case 18:
                    ret = CheckIDCard18(id, out msg);
                    break;
                case 15:
                    ret = CheckIDCard15(id, out msg);
                    break;
            }
            return ret ;
        }

        /// <summary>
        /// 检查身份证是否有效
        /// </summary>
        /// <param name="id">身份证号码</param>
        /// <param name="sex">性别</param>
        /// <param name="msg">返回消息</param>
        /// <returns></returns>
        public static bool CheckIDCardValid(string id, string sex, out string msg)
        {
            if (sex != "男" && sex != "女")
            {
                msg = "sex 参数传入错误";
                return false;
            }
            msg = string.Empty;
            bool ret = true;
            if (!CheckLength(id))
            {
                msg = "身份证号码长度不正确!";
                return false;
            }

            if (!CheckValidWords(id, out msg))
            {
                return false;
            }

            enumIDCardSex enumSex;
            if (sex == "男")
                enumSex = enumIDCardSex.Man;
            else
                enumSex = enumIDCardSex.Woman;


            switch (id.Length)
            {
                case 18:
                    ret = CheckIDCard18(id, enumSex, out msg);
                    break;
                case 15:
                    ret = CheckIDCard15(id, enumSex, out msg);
                    break;
            }

            return ret;
        }

        /// <summary>
        /// 检查身份证长度是否正确
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        private static bool CheckLength(string id)
        {
            if (id.Length != 15 && id.Length != 18)
                return false;
            else
                return true;
        }

        /// <summary>
        /// 检查15位身份证号码(包括性别)
        /// </summary>
        /// <param name="id"></param>
        /// <param name="sex"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        private static  bool CheckIDCard15(string id, enumIDCardSex sex , out string msg)
        {
            msg = string.Empty;
            if (!CheckSex(id[id.Length - 1], sex))
            {
                msg = "性别不匹配";
                return false;
            }

            if(!CheckBirthFormat(id.Substring(6,6)))
            {
                msg = "出生日期格式不正确";
                return false;
            }

            return true;
        }

        /// <summary>
        /// 检查15位身份证号码
        /// </summary>
        /// <param name="id"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        private static bool CheckIDCard15(string id, out string msg)
        {
            msg = string.Empty;
            if(!CheckBirthFormat(id.Substring(6,6)))
            {
                msg = "出生日期格式不正确";
                return false;
            }
            return true;
        }

        /// <summary>
        /// 检查18位身份证号码(包括性别)
        /// </summary>
        /// <param name="id"></param>
        /// <param name="sex"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        private static bool CheckIDCard18(string id, enumIDCardSex sex, out string msg)
        {
            msg = string.Empty;
            if (!CheckSex(id[id.Length - 2], sex))
            {
                msg = "性别不匹配";
                return false;
            }

            if (!CheckBirthFormat(id.Substring(6, 8)))
            {
                msg = "出生日期格式不正确";
                return false;
            }

            if (!CheckVerificationCode(id))
            {
                msg = "身份证号码错误";
                return false;
            }

            return true;
        }

        /// <summary>
        /// 检查18位身份证号码
        /// </summary>
        /// <param name="id"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        private static bool CheckIDCard18(string id, out string msg)
        {
            msg = string.Empty;
            if (!CheckBirthFormat(id.Substring(6, 8)))
            {
                msg = "出生日期格式不正确";
                return false;
            }

            if (!CheckVerificationCode(id))
            {
                msg = "身份证号码错误";
                return false;
            }
            return true;
        }

        /// <summary>
        /// 检查省份代码是否存在
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        private static bool CheckProviceNumExist(string id)
        {
            IList<string> listProvice = new List<string> { 
            "11","22","35","44","53","12","23","36","45","54","13",
            "31","37","46","61","14","32","41","50","62","15","33",
            "42","51","63","21","34","43","52","64","65","71","81","82","91"};
            string proId = id.Substring(0, 2);
            if(!listProvice.Contains(proId))
                return false;
            return true;
        }

        /// <summary>
        /// 检查是否存在非法字符
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <param name="msg">输出信息</param>
        /// <returns></returns>
        private static bool CheckValidWords(string id, out string msg)
        {
            StringBuilder sb = new StringBuilder();
            bool ret = true;
            int index = 1;
            foreach (var p in id)
            {//88 和 120 分别对应的是 X 和 x

                if (index == id.Length)
                {
                    if ((p < 48 || p > 57) && (p != 88 || p != 120))
                    {
                        sb.AppendFormat("第{1}位存在非法字符{0}\r\n", p.ToString(), index.ToString());
                        ret = false;
                    }
                }
                else
                {
                    if (p < 48 || p > 57)
                    {
                        sb.AppendFormat("第{1}位存在非法字符{0}\r\n", p.ToString(), index.ToString());
                        ret = false;
                    }
                }
                index++;
            }
            msg = sb.ToString();
            return ret;
        }

        /// <summary>
        /// 检查身份证对应性别
        /// 对应位 奇数为男性,偶数为女性
        /// </summary>
        /// <param name="c"></param>
        /// <param name="sex"></param>
        /// <returns></returns>
        private static bool CheckSex(char c, enumIDCardSex sex)
        {
            int temp = Convert.ToInt32(c) % 2;
            if ((enumIDCardSex)temp != sex)
            {
                return false;
            }
            return true;
        }


        /// <summary>
        /// 检查出身日期格式
        /// </summary>
        /// <param name="birthDay">身份证中原始生日字符串</param>
        /// <returns></returns>
        private static bool CheckBirthFormat(string birthDay)
        {
            if (birthDay.Length == 8)
            {
                birthDay = birthDay.Insert(6, "-").Insert(4, "-");
            }
            else if (birthDay.Length == 6)
            {
                birthDay = birthDay.Insert(4, "-").Insert(2, "-");
            }

            DateTime dt;
            if (DateTime.TryParse(birthDay, out dt))
                return true;
            else
                return false;

        }

        /// <summary>
        /// 检查校验值
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <returns></returns>
        private static bool CheckVerificationCode(string id)
        {
            string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
            //每位数字对应的加权因子
            IList<int> Wi = new List<int>{ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            char[] Ai = id.Remove(17).ToCharArray();
            int sum = 0;
            for (int i = 0; i <= Wi.Count - 1; i++)
            {
                sum += Convert.ToInt32(Ai[i].ToString()) * Wi[i];
            }
            int y = -1;
            Math.DivRem(sum, 11, out y);
            if (arrVarifyCode[y] != id[17].ToString().ToLower())
            {
                return false;
            }
            return true;
        }
    }

  

posted on 2015-02-05 15:46  小小中  阅读(274)  评论(0编辑  收藏  举报