/// <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;
    }
}

C# 身份证号码15位和18位验证的更多相关文章

  1. 做一个牛XX的身份证号验证类(支持15位和18位)

    原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 1 ...

  2. java中身份证号15位转18位

    /** * 将15位转换为18位 * @param idCode 15位身份证号 * @return String 18位身份证号 */ public String toEighteen(String ...

  3. php提取身份证号码中的生日日期以及验证是否为未成年人的函数

    php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位 ...

  4. 身份证号码15位转18位 C#实现

    [身份证最后一位神秘X的由来]身份证中的“冷知识”1999年的今天,<国务院关于实行公民身份号码制度的决定>被发布,当年10月1日实施.为什么有的有X?这位数是根据前17位计算出的校验码. ...

  5. java 身份证15位转18位

    /** * 根据身份证号获取性别 * * @param pid * 身份证号 * @return 性别 F为女M为男 */ public static String getSexByPid(Strin ...

  6. php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用

    //验证身份证是否有效 function validateIDCard($IDCard) { if (strlen($IDCard) == 18) { return check18IDCard($ID ...

  7. 16Aspx.com-将15位身份证转换成18位

    //********************************************************************************* //将15位身份证转换成18位时 ...

  8. Js完美验证15/18身份证,Js验证身份证,支持15/18位

    Js完美验证15/18身份证,Js验证身份证,支持15/18位 >>>>>>>>>>>>>>>>> ...

  9. js验证15位或18位身份证

    本篇文章是本人在网上搜集了一些验证,然后又个人进行一定修改的关于身份证的验证,欢迎修改指正..... function IdCardValidateRule(idCard) { var tip;    ...

随机推荐

  1. 快速、优雅的前端IDE之H-builder-X

    为什么介绍的是HBuidler-X而不是Hbuilder   HX是全新的一个软件,它抛弃了eclipse架构,使用C++为基础架构.HX目前还不能完全替代HBuilder.但在markdown记事的 ...

  2. 《SQL Server 2008 R2》 收缩数据库日志文件

    USE [master] GO /****** Object: StoredProcedure [dbo].[pro_Shrink_Log] Script Date: 2019/8/16 16:56: ...

  3. JS高阶---继承模式(借用构造函数继承+组合继承)

    (1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .

  4. 201871010136-赵艳强《面向对象程序设计(java)》第十四周学习总结

    201871010136-赵艳强<面向对象程序设计(java)>第十四周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...

  5. Netty之ChannelHandler(三)

    ChannelHandler是netty中的核心处理部分,我们使用netty的绝大部分代码都写在这部分,所以了解它的一些机制和特性是很有必要的. 一.Channel Channel接口抽象了底层soc ...

  6. zz神经网络模型量化方法简介

    神经网络模型量化方法简介 https://chenrudan.github.io/blog/2018/10/02/networkquantization.html 2018-10-02 本文主要梳理了 ...

  7. web框架--tornado之验证码实例

    tornado随机生成图片验证码 用python生成随机验证码需要借鉴一个插件,和一个io模块,实现起来也非常容易,当然也需要借鉴session来判断验证码是否错误,下面写一段用户登录验证带验证码的. ...

  8. LoadRunner名词解释

    Transactions(用户事务分析):用户事务分析是站在用户角度进行的基础性能分析. 1.Transation Sunmmary(事务综述) 对事务进行综合分析是性能分析的第一步,通过分析测试时间 ...

  9. css 在一定区域内滚动显示,不修改父级样式

    做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:图中圈中的部门是滚动的.不修改父级样式 代码: <div class="right-text-bottom"> ...

  10. 推荐一款年轻人交友软件get

    推荐一款年轻人交友软件get 1 介绍 Get是一款认识新朋友的年轻人交友软件.接唱,发现有趣的声音,找到你的音缘.限时聊天,加入给你分配一个3分钟的对象,你们能不能碰撞出一点火花呢?推荐好友,扩列处 ...