偶尔发现身份证号码的规定,觉得甚是好玩,特此标记
身份证验证算法
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 身份验证算法 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if(e.KeyChar < '0' || e.KeyChar >'9') { e.Handled = true; } if((textBox1.SelectionStart == 17) && (e.KeyChar == 'x'||e.KeyChar == 'X')) { e.Handled = false; } if(e.KeyChar == 8) { e.Handled = false; } } /// <summary> /// 校验身份证信息,如果正确,则返回true,否则false /// </summary> /// <param name="id"></param> /// <returns></returns> private bool CheckID(string id) { //身份证1前17位对应的权值 int[] w = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; string checkW = "10X98765432"; string num17 = id.Substring(0, 17); string num18 = id.Substring(17); int sum = 0; for (int i = 0 ; i < 17; i++) { sum += w[i] * Convert.ToInt32(num17[i].ToString()); } int mod = sum % 11; string result = checkW[mod].ToString(); //string类型,忽略大小写的比较 return num18.Equals(result, StringComparison.OrdinalIgnoreCase); } private void button1_Click(object sender, EventArgs e) { int age = 0; int year = 0; //15位:省(2)市(2)区县(2)年(2)月(2)日(2)+3个序列号[奇数男/偶数女] //第7、8位 string id = textBox1.Text.Trim();//去掉两边的空格 if(id.Length == 15) { year = Convert.ToInt32(id.Substring(6,2))+1900; //age = DateTime.Now.Year - year; } //18位:年前面一般都加上19 第18位为校验位,从前面17位计算而来 else if(id.Length == 18) { if(!this.CheckID(id)) { MessageBox.Show("身份证号码有误"); return; } year = Convert.ToInt32(id.Substring(6, 4)); //age = DateTime.Now.Year - year; } else { MessageBox.Show("长度有误"); return; } age = DateTime.Now.Year - year; if(age >= 18) { pictureBox1.Visible = true; } else { MessageBox.Show("nothing"); } } private void Form1_Load(object sender, EventArgs e) { } } }