判断身份证是否合法

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;
            }
        }
    }
}
时间: 2024-11-05 02:23:06

判断身份证是否合法的相关文章

[华为机试]判断身份证信息是否合法

代码为; #include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> int main() { std::vector<std::string> identity; std::string temp; std::ifstream file("in.txt"); while(getline(

验证身份证是否合法算法

可以通过输入身份证的前17位,然后算出18位,与输入的第18位进行校验,判断输入的是否是合法的身份证“ package com.edaixi.testjava; import java.math.MathContext; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestJavaTool { private final static int[] FACTOR = new int[]{7

判断数独是否合法(LintCode)

判断数独是否合法 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用. 表示. 样例 下列就是一个合法数独的样例. 注意 一个合法的数独(仅部分填充)并不一定是可解的.我们仅需使填充的空格有效即可. 说明 什么是 数独? http://sudoku.com.au/TheRules.aspx http://baike.baidu.com/subview/961/10842669.htm 一开始认为会超时于是有了用空间换时间的想法于是出现如下代码.. 后来一想,应该不会超时把..

判断身份证是否和性别相符

用处: 用于判断身份证是否和性别相符 DECODE(MOD(TO_NUMBER(DECODE(Length(certno),15,SUBSTR(certno,15,1),18,SUBSTR(certno,17,1))),2),1,1,0,2)<> GENDER GENDER = 1 男

lintcode 容易题:Valid Sudoku 判断数独是否合法

题目: 判断数独是否合法 请判定一个数独是否有效.该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 样例 下列就是一个合法数独的样例. 注意 一个合法的数独(仅部分填充)并不一定是可解的.我们仅需使填充的空格有效即可. 说明 什么是 数独? http://sudoku.com.au/TheRules.aspx http://baike.baidu.com/subview/961/10842669.htm 解题: 感觉这很难到不知道如何进行,在这里看到,只需判断每行,每类,每个小3*3矩阵

华为在线测试题[基础篇]--判断IP是否合法

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字). 现在需要你用程序来判断IP是否合法. //判断是否为合法IP #include<iostream> #include<string> #include<vector> using namespace std;

判断邮箱是否合法

/** * 验证输入的邮件地址是否合法 * * @access public * @param string $email 需要验证的邮件地址 * * @return bool */ function is_email($user_email) { $chars = "/^([a-z0-9+_]|\\-|\\.)[email protected](([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i"; if (strpos($user_email, '@') !==

as3判断XML是否合法

XML是否合法 在我认为 XML的标签成对 并且根标签外边没有其他东西 以下是合法的 <?xml version="1.0" encoding="utf-8"?> <root><a/>cc</root> <root><a/>cc</root> 以下是我认为不合法的 ASDASDASDASD ASDASD<root><a/>cc</root> asd

js 判断身份证好是否合法

function cidInfo(sId){ var iSum=0 var info="" //if(!/^\d{17}(\d|x)$/i.test(sId))return false; sId=sId.replace(/x$/i,"a"); if (aCity[parseInt(sId.substr(0, 2))] == null) return "身份证格式不正确"; //"Error:非法地区"; sBirthday=s