VB.net 2010 视频教程 VB.net 2010 视频教程 VB.net 2010 视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之提供一个中国身份证号码判断的类(3)

  • 2019-04-13 17:27 来源:未知

  

然后再写一个18位身份证的判断类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    /// <summary>
    /// 中国大陆身份证判断。用于18位判断
    ///
    /// <see cref="!:https://blog.csdn.net/s1102379635/article/details/7967179"/>
    /// <see cref="!:https://blog.csdn.net/qq_26545305/article/details/75042982"/>
    ///
    /// 前1、2位数字表示:所在省(直辖市、自治区)的代码;
    /// 第3、4位数字表示:所在地级市(自治州)的代码;
    /// 第5、6位数字表示:所在区(县、自治县、县级市)的代码;
    /// 第7—14位数字表示:出生年、月、日;
    /// 第15、16位数字表示:所在地的派出所的代码(身份证背面的签发机关);
    /// 第17位数字表示性别:奇数表示男性,偶数表示女性;
    /// 第18位数字是校检码(个人信息码)(有的人是可能是x,这代表的是10罗马数字);
    /// </summary>
    public class ChineseId18Bit : ChineseIdBase
    {
        /// <summary>
        /// 验证18位身份证号
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <returns>验证成功为True,否则为False</returns>
        public override bool IsGrant(string id)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                return false;
            }
            if (id.Length != 18)
            {
                return false;
            }
 
            //数字校验
            if (!this.CheckNumber(id)) { return false; }
            //省市区区域校验,身份前2位拿来判断
            if (!this.CheckAddress(id)) { return false; }
            //生日验证
            if (!this.CheckBirth(id)) { return false; }
            //判断校验码
            if (!this.CheckVerifyCode(id)) { return false; }
 
            return true;//符合GB11643-1999标准
        }
 
        /// <summary>
        /// 数字验证
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <returns></returns>
        protected override bool CheckNumber(string id)
        {
            if (long.TryParse(id.Remove(17), out long n) == false || n < Math.Pow(10, 16) || long.TryParse(id.Replace('x''0').Replace('X''0'), out n) == false)
            {
                return false;//数字验证
            }
 
            return true;
        }
 
        /// <summary>
        /// 针对15位身份证校验生日。取身份证上的第7-14位字符来判断
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <returns></returns>
        protected override bool CheckBirth(string id)
        {
            string birth = id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
            DateTime time = new DateTime();
            if (DateTime.TryParse(birth, out time) == false)
            {
                return false;//生日验证
            }
 
            return true;
        }
 
        /// <summary>
        /// 检测检验码
        /// </summary>
        /// <param name="id">身份证号</param>
        /// <returns></returns>
        private bool CheckVerifyCode(string id)
        {
            string[] vi = ("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 (vi[y] != id.Substring(17, 1).ToLower())
            {
                return false;//校验码验证
            }
 
            return true;
        }
    }
相关教程