根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。

15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)

某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:

∑(ai×Wi)(mod 11)……………………………………(1)

公式(1)中:

i----表示号码字符从右至左包括校验码在内的位置序号;

ai----表示第i位置上的号码字符值;

Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。

i      18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

ai     3 4 0   5 2 4 1 9 8   0 0 1 0 1 0 0 1 a1

Wi     7 9 10 5 8 4 2 1 6   3 7 9 10 5 8 4 2 1

ai×Wi 21 36 0   25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1

根据公式(1)进行计算:

∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189

189 ÷ 11 = 17 + 2/11

∑(ai×Wi)(mod 11) = 2

然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:

∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10

校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace 测试四

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void btnLook_Click(object sender, EventArgs e)

{

//身份证目前可分为15位和18位

//15位号码组成:省(2)市(2)区/县(2)年(2)月(2)日(2)+序列号(3)[奇数分配给男性偶数分配给女性]

//15位升级到18位:出生年都加上19,第二点:第十八位为校验位,也就是说第十八位要从前17位计算而来

//如果是15位数字,那么我们就取得17,8位时出生年

//如果是18位,则先校验用户输入的身份证是否合法,如果合法者去7-10位为出生年

string id = txtId.Text.Trim();

int age = 0;

if (id.Length == 15)

{

int year=Convert.ToInt32(id.Substring(6,2))+1900;

age = DateTime.Now.Year - year;

if (age >= 18)

{

pictureBox1.Visible = true;

}

else

{

MessageBox.Show("年龄太小,不可查看!");

}

}

else if (id.Length == 18)

{

if (!this.checCardId(id))

{

MessageBox.Show("身份证号码输入有误,请检查!");

return;

}

int year = Convert.ToInt32(id.Substring(6,4));

age = DateTime.Now.Year - year;

if (age >= 18)

{

pictureBox1.Visible = true;

}

else

{

MessageBox.Show("年龄太小,不可查看!");

}

}

else

{

MessageBox.Show("您输入的身份证号码长度输入有误!");

return;

}

}

/// <summary>

/// 校验身份证号,如果正确返回true如果错误返回false

/// </summary>

/// <param name="id">

/// //身份证目前可分为15位和18位

//15位号码组成:省(2)市(2)区/县(2)年(2)月(2)日(2)+序列号(3)[奇数分配给男性偶数分配给女性]

//15位升级到18位:出生年都加上19,第二点:第十八位为校验位,也就是说第十八位要从前17位计算而来

//如果是15位数字,那么我们就取得17,8位时出生年

//如果是18位,则先校验用户输入的身份证是否合法,如果合法者去7-10位为出生年

/// </param>

/// <returns></returns>

private bool checCardId(string id)

{

int[] wQuan = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

string checkWei = "10X98765432";

string num17 = id.Substring(0,17);

string num18 = id.Substring(17);

int sum = 0;

for (int i = 0; i < 17; i++)

{

sum += Convert.ToInt32(num17[i].ToString())*wQuan[i];

}

int mod = sum % 11;

string result=checkWei[mod].ToString();

if (num18.Equals(result, StringComparison.OrdinalIgnoreCase))

{

return true;

}

else

{

return false;

}

}

private void txtId_KeyPress(object sender, KeyPressEventArgs e)

{

if(e.KeyChar<'0'||e.KeyChar>'9')

{

//输入数字以外的字符就要阻止调

e.Handled=true;

}

//如果第十八位输入的是X这不阻止

if ((txtId.SelectionStart == 17) && (e.KeyChar == 'X' || e.KeyChar == 'x'))

{

e.Handled = false;

}

//不阻止backspace键

if(e.KeyChar==8)

{

e.Handled = false;

}

}

private void pictureBox1_Click(object sender, EventArgs e)

{

}

private void txtId_TextChanged(object sender, EventArgs e)

{

pictureBox1.Visible = false;

}

}

}

国民身份证号码校验之“C#/Winform方法实现+案例分析”的更多相关文章

  1. 前端JS校验银行卡卡号和身份证号码(附ES6版方法)

    1.银行卡卡号校验方法. function luhnCheck(bankno) { var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一 ...

  2. JS身份证号码校验

    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 var ValideCode = [ 1, 0 ...

  3. 【转】身份证号码校验与信息提取 - Java 代码

    转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148 import java.util.regex.*;   /**   ...

  4. Java实现身份证号码校验

    二话不说,直接上代码. package hope.identitycodecheck.demo; import java.text.DateFormat; import java.text.Simpl ...

  5. JS011. 身份证号码校验(仅34行)

    身份证格式 六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位数字校验码 checkIdCard.js checkIdCard: function (idCard){ //15位和1 ...

  6. js实现手机号码和身份证号码校验

    <script type="text/javascript"> function checkform() { var re; var ss = document.get ...

  7. iOS开发之身份证号码校验

    // //  Card.h //  THCStore // //  Created by Mac on 15/7/15. //  Copyright (c) 2015年 Mac. All rights ...

  8. parseInt和map方法使用案例分析

    ["1","2","3"].map(parseInt) //[1,NaN,NaN] 先看map()方法 定义和用法 map() 方法返回一个 ...

  9. C#解决从含身份证号码的Excel表格导入数据库的问题

    用C#做从Excel表导入SQL数据库时发现从EXCEL导入的身份证号码会变成科学表示方法. 解决这个问题是比较容易的,首先,打开电子表格,选中“身份证号码”一列,右键选择“设置单元格格式”,进入单元 ...

随机推荐

  1. jQuery常用及基础知识总结(二)

    JQuery Effects 方法说明 show( ) 显示隐藏的匹配元素.show( speed, [callback] ) 以优雅的动画显示所有匹配的元素,并在显示完成后可选地触发一个回调函数.h ...

  2. 数的计数(number)

    数的计数(number) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n),先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: (1)不作任何处理: (2)在它的 ...

  3. 利用MFC编写计算器

    端午节这两天没什么事,就用MFC写了一个简单的计算器,界面做的也比较简单,如下图1,可以进行简单的加.减.乘和除功能,小数点显示这块做的不是很好,比如输入1.2,不会一个个的显示,而是先显示“1”,后 ...

  4. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  5. Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE

    Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 晚上在测一个widget,前面测的好好的,后面再安装的时候发现如下错误:[2009-06- ...

  6. Bluez SPP实现代码分析(转)

    源:http://blog.csdn.net/walkingman321/article/details/7218705 本文分析蓝牙协议栈中蓝牙转串口(SPP)部分的实现. 1.  基本概念 Blu ...

  7. 针对iOS10的各种问题的解决方法

    1.iOS10相册相机闪退bug: iOS10系统下调用系统相册,相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to acc ...

  8. struts2-----新建项目

    1. 建立界面原型 2. 建立Struts.xml 确定namespace, package, action, 空方法, result, 界面原型修改, 匹配现有设置, 测试, 做好规划 3. 建立数 ...

  9. Android之ListView的快速滑动模式:fastScrollEnabled以及滑块的自定义

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0917/1690.html http://blog.csdn.net/xyang ...

  10. IO之同步、异步、阻塞、非阻塞 (2)

    [原创链接: http://www.smithfox.com/?e=191, 转载请保留此声明, 谢谢! ] I/O Model 是一个很大的话题, 也是一个实践性很强的事情, 网上有各种说法和资料, ...