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

原文地址:https://www.cnblogs.com/fanying/p/10919038.html

时间: 2024-10-08 06:12:01

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

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

原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 15) str = CidUpdate(str); if (str.Length == 18) { string strResult = CheckCidInfo(str); if (strResult == "非法地区" || strResult == "非法生日" |

简单的关于身份证(15位或者18位)合法性验证

package com.clark.test.idcard; /** * 测试校验身份证合法性的小程序 * <p>我们常用的身份证号码为18位或者15位</p> <p>下面的程序仅仅用于校验18为的身份证的合法性</p> * @author caolipeng * @date 2015年1月9日 上午10:27:13 * @Version 1.0 */ public class IDCardValidator { <span style="c

身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X

function checkIdCardNo(idCardNo) { // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; if (reg.test(idCardNo) === false) { wx.showToast({ title: '身份证号码不正确!', icon: 'none', }) return false; }

java中身份证号15位转18位

/** * 将15位转换为18位 * @param idCode 15位身份证号 * @return String 18位身份证号 */ public String toEighteen(String idCode) { idCode = idCode.substring(0, 6) + "19" + idCode.substring(6);//加入年份,变成17位 //计算校验位 begin char[] Ai = idCode.toCharArray(); int[] Wi = {

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

php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位和18位身份证 function getIDCardInfo($IDCard){ $result['error']=0;//0:未知错误,1:身份证格式错误,2:无错误 $result['flag']='';//0标示成年,1标示未成年 $result['tdate']='';//生日,格式如:2012-

身份证号码 15位和18位 验证

首先先了解 身份证号码的编码规则,从百度经验上找到了别人的分享 :http://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html 感谢. 15位长度的验证正则是从网上找的,但发现并不是万能的(月份可以出现00,日期可以出现00等), 所以做了如下改良,但仍旧存在一些问题,如880231这样的生日也可以验证功过 所以可以考虑将身份证号码的年月日单独判断,在此略去. 18位长度的就按校验规则来校验即可. function chkIdNo(

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

[身份证最后一位神秘X的由来]身份证中的“冷知识”1999年的今天,<国务院关于实行公民身份号码制度的决定>被发布,当年10月1日实施.为什么有的有X?这位数是根据前17位计算出的校验码.如某人尾号是0-9,不会有X,如是10,则用X代替.Ⅹ是罗马数字的10,这能保证身份证号不多位. /// <summary> /// 转换15位身份证号码为18位 /// </summary> /// <param name="oldIDCard">15

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

//验证身份证是否有效 function validateIDCard($IDCard) { if (strlen($IDCard) == 18) { return check18IDCard($IDCard); } elseif ((strlen($IDCard) == 15)) { $IDCard = convertIDCard15to18($IDCard); return check18IDCard($IDCard); } else { return false; } } //计算身份证的

身份证15位转18位

create or replace function changeaac002_15to18( ls_card varchar2)return varchar2 is ls_newcard varchar2(18);a1 number(10);a2 number(10);a3 number(10);a4 number(10);a5 number(10);a6 number(10);a7 number(10);a8 number(10);a9 number(10);a10 number(10);a