C#中华人民共和国身份证验证

来源:互联网 发布:历史地图 数据库 编辑:程序博客网 时间:2024/04/29 09:29



规则见http://www.zhanglihai.com/article/2004/11/29/H176H3G0100200G0M060HE8DKUXYWJNE.html
#region 大陸身份證號碼驗證
private bool CheckIDCard_CHS(string IDCard)
{
        string[] arrVarifyCode=("1,0,x,9,8,7,6,5,4,3,2").Split(',');
        string[] Wi=("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
        string[] Checker=("1,9,8,7,6,5,4,3,2,1,1").Split(',');
        int intLength=IDCard.Length;
 
        int i=0,TotalmulAiWi=0;
        int modValue=0;
        string strVerifyCode="";
        string Ai="";
        string BirthDay="";
        int intYear=0;
        int intMonth=0;
        int intDay=0;
 
        if(intLength<15||intLength==16||intLength==17||intLength>18)
        {
                return false;
        }
        if(intLength==18)
        {
                Ai=IDCard.Substring(0,17);
        }
        else if(intLength==15)
        {
                Ai=IDCard;
                Ai=Ai.Substring(0,6)+"19"+Ai.Substring(6,9);
        }
        if(!IsNumeric(Ai))return false;
 
        intYear=Convert.ToInt32(Ai.Substring(6,4));
        intMonth=Convert.ToInt32(Ai.Substring(10,2));
        intDay=Convert.ToInt32(Ai.Substring(12,2));
 
        BirthDay=intYear.ToString()+"-"+intMonth.ToString()+"-"+intDay.ToString();
        if(IsDateTime(BirthDay))
        {
                DateTime DateBirthDay=DateTime.Parse(BirthDay);
                if(DateBirthDay>DateTime.Now)
                {
                        return false;
                }
 
                int intYearLength=DateBirthDay.Year-DateBirthDay.Year;
                if(intYearLength<-140)
                {
                        return false;
                }
        }
 
        if(intMonth>12||intDay>31)
        {
                return false;
        }
 
        for(i=0;i<17;i++)
        {
                TotalmulAiWi=TotalmulAiWi+(Convert.ToInt32(Ai.Substring(i,1))*Convert.ToInt32(Wi[i].ToString()));
        }
        modValue=TotalmulAiWi % 11;
 
        strVerifyCode=arrVarifyCode[modValue].ToString();
        Ai=Ai + strVerifyCode;
        if(intLength==18&&IDCard!=Ai)
        {
                return false;
        }
        return true;
}
#endregion
/// <summary>
/// 判斷字符串是否可轉換為DateTime
/// </summary>
/// <param name="s">要判斷的字符串</param>
/// <returns>true=可以轉換;false=無法轉換</returns>
private bool IsDateTime(string s)
        try
        {
                System.DateTime.Parse(s);
        } 
        catch
        {
                return   false;
        }
        return true; 
}
 
/// <summary>
/// 判斷字符串是否可以轉換為數字
/// </summary>
/// <param name="value">要判斷的字符串</param>
/// <returns>true=可以轉換;false=無法轉換</returns>
private bool IsNumeric(object value)
{
        try
        {
                double i = Convert.ToDouble (value.ToString());
                return true;
        }
        catch (FormatException)
        {
                return false;
        }
}