1 using System;
2 using System.Text.RegularExpressions;
3
4 namespace com.hooPony.utils.utils
5 {
6 /// <summary>
7 /// 中国居民身份证工具类
8 /// <code>@author hooPony</code>
9 /// 前6位是地址码,表示登记户口时所在地的行政区划代码,依照《中华人民共和国行政区划代码》国家标准(GB/T2260)的规定执行。
10 /// 7到14位是出生年月日,采用YYYYMMDD格式。
11 /// 15到17位是顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编订的顺序号,顺序码的奇数分配给男性,偶数分配给女性,即第17位奇数表示男性,偶数表示女性。
12 /// 第18位是校验码,采用ISO 7064:1983, MOD 11-2校验字符系统。
13 /// </summary>
14 public class IDCard
15 {
16 /// <summary>
17 /// 加权因子
18 /// </summary>
19 private static int[] MOD = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
20
21 /// <summary>
22 /// 校验码
23 /// </summary>
24 private static char[] VERCODE = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
25
26 /// <summary>
27 /// 验证身份证是否符合国家标准,地址码可能不准确
28 /// </summary>
29 /// <param name="idcard">身份证号</param>
30 /// <returns></returns>
31 public static bool verify(string idcard)
32 {
33 if (idcard == null || idcard.Length != 18)
34 {
35 return false;
36 }
37 string regex = "^(1[1-5]{1}|2[1-3]{1}|3[1-7]{1}|4[1-6]{1}|5[0-4]{1}|6[1-5]{1}){1}(([0-7]{1}[0-9]{1}|90){1}[0-9]{1}[0-9]{1}(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)){1}([0-9]{1}[0-9]{1}[0-9]{1}([0-9]{1}|x|X){1}){1}$";
38 bool res = Regex.IsMatch( idcard, regex);
39 if (!res)
40 {
41 return false;
42 }
43 // 检验校验码
44 char[] chars = idcard.ToCharArray();
45 int sum = 0;
46 try
47 {
48 for (int i = 0; i < MOD.Length; i++)
49 {
50 sum += int.Parse(chars[i].ToString()) * MOD[i];
51 }
52 }
53 catch (Exception e)
54 {
55 return false;
56 }
57 if (chars[chars.Length - 1] != VERCODE[sum % 11])
58 {
59 return false;
60 }
61 return true;
62 }
63 }
64 }