数据分析-身份证号码

简介

XX XX XX XXXX XX XX XXX X
区(县) 出生年 顺序码 校验码

*现身份证由 GB 11643-1999 标准规定的 18 位数字或字母(仅结尾X)组成。
1.前六位表示为常驻户口所在地的行政区划代码,由 GB/T 2260-2007 标准执行。
2.第七位至第十四位为出生年、月、日。
3.第十五位至第十七位为顺序码(其中包含派出所代码,第十七位也用来表示性别:奇数表示男性,偶数表示女性)
4.第18位数字是校检码:用来检验身份证的正确性。校检码可以是0~10的数字,10用X表示。

空白正反面

代码示例

正则表达式校验

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
/// <summary>
/// 效验身份证号码
/// </summary>
/// <param name="strIDNumber">身份证号码</param>
/// <returns>效验通过返回true,失败返回false</returns>
public static bool CheckIDNumber(string strIDNumber)
{
try
{
if (strIDNumber.Length == 15 && CheckIDCard15(strIDNumber))
{
return true;
}
else if (strIDNumber.Length == 18 && CheckIDCard18(strIDNumber))
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
return false;
}
}

/// <summary>
/// 15位身份证号验证
/// </summary>
/// <param name="idNumber">身份证号</param>
/// <returns>效验通过返回true,失败返回false</returns>
private static bool CheckIDCard15(string idNumber)
{
long n = 0;
if (long.TryParse(idNumber, out n) == false || n < Math.Pow(10, 14))
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = idNumber.Substring(6, 6).Insert(4, "-").Insert(2, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
return true;//符合15位身份证标准
}

/// <summary>
/// 18位身份证号码验证
/// </summary>
/// <param name="idNumber">身份证号</param>
/// <returns>效验通过返回true,失败返回false</returns>
private static bool CheckIDCard18(string idNumber)
{
long n = 0;
if (long.TryParse(idNumber.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(idNumber.Replace('x', '0').Replace('X', '0'), out n) == false)
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = idNumber.Substring(6, 8).Insert(6, "-").Insert(4, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
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 = idNumber.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);
Console.WriteLine("Y的理论值: " + y);
if (arrVarifyCode[y] != idNumber.Substring(17, 1).ToLower())
{
return false;//校验码验证
}
return true;//符合GB11643-1999标准
}

补全身份证号

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
class Program
{
static void Main(string[] args)
{
string SavePath = @"C:\test.txt";
//在很多场景会获得不完整身份证号,例如火车票或APP上的社保信息
//通过校验的方式推算出正确的身份证号范围,至少输入校验位
Console.WriteLine("输入18位身份证号码(至少输入校验位)不知道的用*代替");
string strIDNumber = Console.ReadLine();
List<int> listSubscript = new List<int>();
List<char> listChar = strIDNumber.ToList();
for (int i = 0; i < listChar.Count; i++)
{
if (listChar[i].Equals('*'))
{
listSubscript.Add(i);
}
}
for (int i = 0; i <= int.Parse(new string('9', listSubscript.Count)); i++)
{
var vString = i.ToString().PadLeft(listSubscript.Count, '0');
for (int j = 0; j < listSubscript.Count; j++)
{
listChar[listSubscript[j]] = char.Parse(vString.Substring(j, 1));
}
var vIDNumber = string.Join("", listChar.ToArray());
if (CheckCorrectnessHelper.CheckIDNumber(vIDNumber))
{
Console.ForegroundColor = ConsoleColor.Green;
AdoptIDNumber.Add(vIDNumber);
Console.WriteLine($"生成身份证号:{vIDNumber}");
TXTHelper.AppendFile(SavePath, vIDNumber, true);
}
else
{
//Console.ForegroundColor = ConsoleColor.Red;
//Console.WriteLine($"生成身份证号:{vIDNumber}");
}
}
Console.ReadLine();
}

/// <summary>
/// 测试通过的全局保存
/// </summary>
static List<string> AdoptIDNumber = new List<string>();
}

行政区划查询

下载:areacodebase.xlsb