验证身份证的准确性

验证身份证的准确性

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:Visual Studio 2015

作者:李成富

撰写时间:2019年6月12日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

想要验证身份证号的准确性,就必须先了解身份证号的含义。身份证号都代表了什么意思?

接下来我们看看身份证号的结构:公民身份证号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  1. 地址码(前六位数):表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
  2. 出生日期码(第七位至十四位):表示编码对象出生的年、月、日,年、月、日代码之间不用分隔符。
  3. 顺序码(第十五位至十七位):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性(就是判断第十七位数是奇数还是偶数,奇数代表的是男性,偶数代表的是女性)。
  4. 校验码(第十八位数):
  1. 十七位数字本体码加权求和公式,先对前17位数字的权求和
  2. 计算模
  3. 通过模得到对应的校验码

校验码:1 0 X 9 8 7 6 5 4 3 2

身份证号码的结构大概就是这样了,现在了解了身份证号码的含义了,那么接下来看看如何通过C#编程来实现对身份证号码的验证和自动回填地址和出生日期以及性别吧!

首先在XAML页面给身份证号文本框一个文本事件,然后在C#页面进行编程验证。

XAML:

<TextBlock Grid.Row="5" Grid.Column="1" Text="证件号:" />

<TextBox x:Name="txt_CertificateType" Grid.Row="5" Grid.Column="3" MaxLength="18" TextChanged="txt_CertificateType_TextChanged" />

C#编程:

  1. 声明一个变量来获取XAML窗口身份证号文本框的值。

string strCertificate = txt_CertificateType.Text.Trim();

  1. 判断身份证号码的长度是否等于18位数,如果等于就进行判断非正则表达式(闰年出生日期的合法性正则表达式 ||  平年出生日期的合法性正则表达式),否则进行切割字符串,声明一个变量来获取证件号,后面将对这个变量来切割,首先切割出性别,身份证号的第17位数表示的是男女性别,判断截取到的sex除以2后,余数是否等于0,如果等于0,就代表的是女性(偶数代表女性),否则就是男性。接着切割年月日来绑定出生日期,然后是年龄,用今年的年份减去出生日期的年份就是岁数了,所以要获取今年的年和获取(截取身份证)出生日期。

 if (strCertificate.Length == 18)

{

  if (!Regex.IsMatch(strCertificate,

@"(^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$)") ||

      !Regex.IsMatch(strCertificate,

@"(^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$)"))

     {

         MessageBox.Show("证件号不合法!");

         txt_CertificateType.Text = "";

      }

      else

{

}

}

  1. 否则判断地址码,声明一个变量来获取CheckIDCardGetDiQu类里面的地址码,再判断声明的变量是否为空,如果等于空,那么提示身份证号不合法并且清空文本值,否则回填地址

else if(txt_CertificateType.Text.ToString().Length==6)

{

 

}

C#的完整代码如下所示:

private void txt_CertificateType_TextChanged(object sender, TextChangedEventArgs e)

{

try

{

//声明一个变量来获取XAML身份证号文本框的值

string strCertificate = txt_CertificateType.Text.Trim();

//判断准确性

if (strCertificate.Length == 18)

{

//闰年出生日期的合法性正则表达式  ||  平年出生日期的合法性正则表达式

if (!Regex.IsMatch(strCertificate, @"(^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$)")  ||

!Regex.IsMatch(strCertificate, @"(^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$)"))

{

MessageBox.Show("证件号不合法!");

txt_CertificateType.Text = "";

}

else

{

//2)切割字符串()

//声明一个变量来获取证件号,后面将对这个变量来切割

string keys = strCertificate;

//切割出性别,身份证号的第17位数表示的是男女性别

int sex = int.Parse(keys.Substring(16, 1));

//判断截取到的sex除以2后,余数是否等于0,如果等于0,就代表的是女性(偶数代表女性),否则就是男性

if (sex % 2 == 0)

{

cbo_Gender.SelectedValue = 77;

}

else

{

cbo_Gender.SelectedValue = 76;

}

//分别切割年月日

string Year = keys.Substring(6, 4);

string Month = keys.Substring(10, 2);

string Day = keys.Substring(12, 2);

//绑定出生日期

dtp_Birthday.Text = Year + "" + Month + "" + Day + "";

//获取今年的年

string Y = DateTime.Now.Year.ToString();

//把今年转化成数字

decimal NowY = Convert.ToInt32(Y);

//获取(截取身份证)出生日期

decimal NowYear = Convert.ToInt32(Year);

//获取虚岁

decimal age = Convert.ToDecimal(NowY - NowYear) + 1;

//绑定年龄

txt_Age.Text = age.ToString().Trim();

}

}

else if(txt_CertificateType.Text.ToString().Length==6)

{

string strAddress = CheckIDCardGetDiQu.LoadAddress(txt_CertificateType.Text.ToString());

if (strAddress == "")

{

MessageBox.Show("身份证不合法!");

txt_CertificateType.Text = "";

}

else {

//联系地址

txt_Address.Text = strAddress;

}

}

}

catch (Exception)

{

throw;

}

}

效果图如下:

输入前六位数时回填地址

输完18位数后,回填出生日期、年龄和性别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值