身份证校验

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
static string TestCardId(string cardId)
        {
            string pattern = @"^\d{17}(?:\d|X)$";
            string birth = cardId.Substring(6, 8).Insert(6, "-").Insert(4, "-");
            DateTime time = new DateTime();
            // 加权数组,用于验证最后一位的校验数字
            int[] arr_weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            // 最后一位计算出来的校验数组,如果不等于这些数字将不正确
            string[] id_last = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };  
            int sum = 0;
            //通过循环前16位计算出最后一位的数字
            for (int i = 0; i < 17; i++)
            {
                sum += arr_weight[i] * int.Parse(cardId[i].ToString());
            }
             // 实际校验位的值
            int result = sum % 11;
            // 首先18位格式检查
            if (Regex.IsMatch(cardId, pattern))
            {   // 出生日期检查
                if (DateTime.TryParse(birth, out time))         
                {
                    // 校验位检查
                    if (id_last[result] == cardId[17].ToString()) 
                    {
                        return "身份证验证成功!";
                    }
                    else
                    {
                        return  "身份证最后一位校验错误!";
                    }
                }
                else
                {
                    return "出生日期验证失败!";
                }
            }
            else
            {
                return "身份证号格式错误!";
            }
        }
//调用
var rel=  TestCardId("11019819860908662X");
 Console.WriteLine(rel);

  

posted @   慢慢摸索  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示