判断身份证是否合法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断身份证是否合法相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common
{
   public static class IdentityCardHelper
    {
        /// <summary>
        /// 1、判断身份证是否合法
        /// 2、判断用户是否成年
        /// </summary>
        /// <param name="cardId"></param>
        /// <returns></returns>
        public static bool CheckCardAndUser(string cardId, out int userAntiAddiction, out DateTime birthDay)
        {
            userAntiAddiction = 0;
            birthDay = DateTime.MinValue;
            if ( cardId.Length == 18 )
            {
                return CheckCard18( cardId, out userAntiAddiction, out  birthDay );
            }
            else if ( cardId.Length == 15 )
            {
                return CheckCard15( cardId, out userAntiAddiction, out  birthDay );
            }
            else
            {
                if ( Config.AntiAddiction == "1" ) { userAntiAddiction = 2; }
                return false;
            }
        }

        /// <summary>
        /// 18位
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        private static bool CheckCard18(string Id, out int userAntiAddiction, out DateTime birthDay)
        {
            userAntiAddiction = 0;
            birthDay = DateTime.MinValue;
            bool isAntiAddiction = Config.AntiAddiction == "1" ? true : false;
            long n = 0;
            if ( long.TryParse( Id.Remove( 17 ), out n ) == false || n < Math.Pow( 10, 16 ) || long.TryParse( Id.Replace( x, 0 ).Replace( X, 0 ), out n ) == false )
            {
                return false;//数字验证
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if ( address.IndexOf( Id.Remove( 2 ) ) == -1 )
            {
                return false;//省份验证
            }
            string birth = Id.Substring( 6, 8 ).Insert( 6, "-" ).Insert( 4, "-" );
            DateTime time = new DateTime();
            if ( DateTime.TryParse( birth, out time ) == false )
            {
                return false;//生日验证
            }
            else
            {
                birthDay = time;
                if ( isAntiAddiction )
                {
                    if ( time.AddYears( 18 ) >= DateTime.Now )
                    {
                        userAntiAddiction = 2;
                    }
                    else
                    {
                        userAntiAddiction = 1;
                    }
                }
            }
            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( , );
            char[] Ai = Id.Remove( 17 ).ToCharArray();
            int sum = 0;
            for ( int i = 0; i < 17; i++ )
            {
                sum += int.Parse( Wi[i] ) * int.Parse( Ai[i].ToString() );
            }
            int y = -1;
            Math.DivRem( sum, 11, out y );
            if ( arrVarifyCode[y] != Id.Substring( 17, 1 ).ToLower() )
            {
                return false;//校验码验证
            }
            return true;//符合GB11643-1999标准
        }

        /// <summary>
        /// 15位
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        private static bool CheckCard15(string Id, out int userAntiAddiction, out DateTime birthDay)
        {
            userAntiAddiction = 0;
            birthDay = DateTime.MinValue;
            bool isAntiAddiction = Config.AntiAddiction == "1" ? true : false;
            long n = 0;
            if ( long.TryParse( Id, out n ) == false || n < Math.Pow( 10, 14 ) )
            {
                return false;//数字验证
            }
            string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
            if ( address.IndexOf( Id.Remove( 2 ) ) == -1 )
            {
                return false;//省份验证
            }
            string birth = Id.Substring( 6, 6 ).Insert( 4, "-" ).Insert( 2, "-" );
            DateTime time = new DateTime();
            if ( DateTime.TryParse( birth, out time ) == false )
            {
                return false;//生日验证
            }
            else
            {
                birthDay = time;
                if ( isAntiAddiction )
                {
                    if ( time.AddYears( 18 ) >= DateTime.Now )
                    {
                        userAntiAddiction = 2;
                    }
                    else
                    {
                        userAntiAddiction = 1;
                    }
                }
            }
            return true;//符合15位身份证标准
        }
    }

    public class Config {
        public static string AntiAddiction
        {
            get
            {
                string antiAddiction = "1";
                return string.IsNullOrEmpty(antiAddiction) ? "0" : antiAddiction;
            }
        }
    }
}

 

以上是关于判断身份证是否合法的主要内容,如果未能解决你的问题,请参考以下文章

oracle判断身份证号码是否合法(包含15位身份证)

oracle判断身份证号码是否合法(包含15位身份证)

oracle判断身份证号码是否合法(包含15位身份证)

oracle判断身份证号码是否合法(包含15位身份证)

js判断身份证号码是不是合法有效全国通用

身份证验证js