zoukankan      html  css  js  c++  java
  • C# 身份证号码15位和18位验证

    /// <summary>
    /// 身份证
    /// </summary>
    [Serializable]
    public class IDCard
    {
        /// <summary>
        /// 身份证号
        /// </summary>
        public string IDCardNum { get; set; }
        /// <summary>
        /// 行政区
        /// </summary>
        public string Canton { get; private set; }
        /// <summary>
        /// 出生日期
        /// </summary>
        public DateTime Birthday { get; private set; }
        /// <summary>
        /// 性别(0-女;1-男)
        /// </summary>
        public int Gander { get; private set; }
        /// <summary>
        /// 是否为合法身份证号
        /// </summary>
        public bool IsIDCard { get; private set; }
     
        public IDCard() { }
     
        public IDCard(string IDnumber)
        {
            this.IDCardNum = IDnumber;
        }
     
     
        /// <summary>
        /// 
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static IDCard Parse(string number)
        {
            IDCard idCard = new IDCard(number);
     
            const int s5bits = 15;
            const int s8bits = 18;
     
            #region 15位
            if (number.Length == s5bits)  //15位的处理
            {
                //检查输入是否为数字
                for (int i = 0; i < number.Length; i++)
                {
                    if ((number[i] < '0') || (number[i] > '9'))
                    {
                        throw new FormatException("身份证号错误");
                    }
                }
     
                //出生日期
                string birthday = "19" + number.Substring(6, 6);
                string year = birthday.Substring(0, 4);
                string month = birthday.Substring(4, 2);
                string day = birthday.Substring(6, 2);
                birthday = string.Format("{0}-{1}-{2}", year, month, day);
     
                DateTime date = new DateTime();
                if (DateTime.TryParse(birthday, out date))
                {
                    idCard.Birthday = date;
                }
                else
                {
                    throw new InvalidCastException("身份证号出生日期错误");
                }
                
                //性别
                if ((number[s5bits - 1] == '0') || (number[s5bits - 1] % 2 == 0))
                {
                    idCard.Gander = 0; // 女
                }
                else
                {
                    idCard.Gander = 1; // 男
                }
     
                idCard.IsIDCard = true;
                return idCard;
            }
            #endregion
     
            #region 18位
            else if (number.Length == s8bits)  //18位的处理
            {
                // 检查前17位是否为数字
                for (int i = 0; i < number.Length -1; i++)
                {
                    if ((number[i] < '0') || (number[i] > '9'))
                    {
                        throw new FormatException("身份证号错误");
                    }
                }
     
                char end = number[s8bits - 1];  //最后一位
     
                //最后1位是x转成大写X
                if (end == 'x')
                {
                    end = 'X';
                    number = number.Substring(0, s8bits - 1) + end;
                }
     
                if (!(end == 'X' || (end >= '0' && end <= '9')))
                {
                    throw new FormatException("身份证号错误");
                }
                
                /// 校验
                int num = 0;
                char proof;
                for (int i = 17; i > 0; i--)
                {
                    num = num + (int)(Math.Pow(2, i) % 11) * (number[17 - i] - 48);
                }
                num %= 11;
                switch (num)
                {
                    case 0:
                        proof = '1';
                        break;
                    case 1:
                        proof = '0';
                        break;
                    case 2:
                        proof = 'X';
                        break;
                    default:
                        proof = (char)(12 - num + 48);
                        break;
                }
     
                if (end != proof)  //最后一位与校验码不符
                {
                    throw new FormatException("身份证号错误");
                }
     
                //出生日期
                string birthday = number.Substring(6, 8);
                string year = birthday.Substring(0, 4);
                string month = birthday.Substring(4, 2);
                string day = birthday.Substring(6, 2);
                birthday = string.Format("{0}-{1}-{2}", year, month, day);
     
                DateTime date = new DateTime();
                if (DateTime.TryParse(birthday, out date))
                {
                    idCard.Birthday = date;
                }
                else
                {
                    throw new InvalidCastException("身份证号出生日期错误");
                }
     
                //行政区
                idCard.Canton = number.Substring(0, 6);
     
                //性别
                if ((number[16] == '0') || (number[16] % 2 == 0))
                {
                    idCard.Gander = 0;  //女
                }
                else
                {
                    idCard.Gander = 1;  //男
                }
     
                idCard.IsIDCard = true;
                return idCard;
            }
            #endregion
            else
            {
                throw new FormatException("无效的身份证号码位数:" + number.Length);
            }
        }
     
        public static bool TryParse(string number, out IDCard card)
        {
            IDCard idCard = null;
            bool isIdCard = true;
            try
            {
                Parse(number);
            }
            catch (Exception)
            {
                isIdCard = false;
            }
            card = idCard;
            return isIdCard;
        }
    }
  • 相关阅读:
    【转】android新建项目时 出现appcompat_v7工程错误和红色感叹号
    【转】eclipse新建项目,报错“Error: workspaceappcompat_v7 esvalues-v21styles_base.xml No resource found that matches the given name”
    【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
    【转】Windows搭建Eclipse+JDK+SDK的Android
    【转】Ubuntu 14.04配置安装java环境和android开发环境(包括真机调试环境)
    【转】[MTK软件原创] [SELinux] 如何设置确认selinux模式
    【转】Android中removeCallbacks失效原因
    【转】Android
    【转】Android开发20——单个监听器监听多个按钮点击事件
    【编程】辨异 —— proxy 与 delegate
  • 原文地址:https://www.cnblogs.com/fanying/p/10919038.html
Copyright © 2011-2022 走看看