博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 身份证号码15位和18位验证
阅读量:6095 次
发布时间:2019-06-20

本文共 4834 字,大约阅读时间需要 16 分钟。

/// /// 身份证/// [Serializable]public class IDCard{    ///     /// 身份证号    ///     public string IDCardNum { get; set; }    ///     /// 行政区    ///     public string Canton { get; private set; }    ///     /// 出生日期    ///     public DateTime Birthday { get; private set; }    ///     /// 性别(0-女;1-男)    ///     public int Gander { get; private set; }    ///     /// 是否为合法身份证号    ///     public bool IsIDCard { get; private set; }     public IDCard() { }     public IDCard(string IDnumber)    {        this.IDCardNum = IDnumber;    }      ///     ///     ///     /// 
    /// 
    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;    }}

转载于:https://www.cnblogs.com/fanying/p/10919038.html

你可能感兴趣的文章
MSDN Webcast - Silverlight for Windows Phone 开发系列课程(1):Windows Phone平台概况
查看>>
OER 7451 in Load Indicator:Error Code=OSD-04500
查看>>
在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用
查看>>
PROC 存储过程 二
查看>>
mysql删除数据,空间无法释放,alter
查看>>
iOS 计算文字高度
查看>>
xstream cdata 处理方式之一
查看>>
cubes mysql 中文乱码
查看>>
2014年的一些大数据事件
查看>>
Rmi在Spring中的使用之RmiServiceExporter
查看>>
div的移动特效
查看>>
浏览器的本地存储方案及跨域
查看>>
tornado gen
查看>>
锐捷RG-WALL60防火墙配置详解
查看>>
远程桌面
查看>>
2015年下半年软考中高级学员精讲班 第四章
查看>>
DNS域传送泄露漏洞测试方法
查看>>
原创经验:微信小程序开发总结
查看>>
创建swap文件与删除swap分区
查看>>
Linux Shell实现多进程并发执行
查看>>