国民身份证号码校验之“C#/Winform方法实现+案例分析”
根据〖中华人民共和国国家标准 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方法实现+案例分析”的更多相关文章
- 前端JS校验银行卡卡号和身份证号码(附ES6版方法)
1.银行卡卡号校验方法. function luhnCheck(bankno) { var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一 ...
- 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 ...
- 【转】身份证号码校验与信息提取 - Java 代码
转载地址:http://www.w3china.org/blog/more.asp?name=lhwork&id=19148 import java.util.regex.*; /** ...
- Java实现身份证号码校验
二话不说,直接上代码. package hope.identitycodecheck.demo; import java.text.DateFormat; import java.text.Simpl ...
- JS011. 身份证号码校验(仅34行)
身份证格式 六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位数字校验码 checkIdCard.js checkIdCard: function (idCard){ //15位和1 ...
- js实现手机号码和身份证号码校验
<script type="text/javascript"> function checkform() { var re; var ss = document.get ...
- iOS开发之身份证号码校验
// // Card.h // THCStore // // Created by Mac on 15/7/15. // Copyright (c) 2015年 Mac. All rights ...
- parseInt和map方法使用案例分析
["1","2","3"].map(parseInt) //[1,NaN,NaN] 先看map()方法 定义和用法 map() 方法返回一个 ...
- C#解决从含身份证号码的Excel表格导入数据库的问题
用C#做从Excel表导入SQL数据库时发现从EXCEL导入的身份证号码会变成科学表示方法. 解决这个问题是比较容易的,首先,打开电子表格,选中“身份证号码”一列,右键选择“设置单元格格式”,进入单元 ...
随机推荐
- (转) hadoop 一个Job多个MAP与REDUCE的执行
http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...
- php查找文件内容
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><?ph ...
- android缓存之Lrucache 和LinkedHashMap
两者的区别 网上有很多人使用软引用加载图片的多 ,但是现在已经不再推荐使用这种方式了,(1)因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的 ...
- JS基础知识——缓动动画
基于距离的缓动动画 原理:设定起始位置 start 和终止位置 end,变化会越来越慢. 公式:start=start+(end-start)/10; 这个10不是固定的,想分成多少份就分成 ...
- Hibernate---第一个helloworld程序 (XML版本, annotation版本)
Hibernate作为JPA的一种实现,jpa的注解已经是hibernate的核心,hibernate只提供了一些补充,而不是两套注解.hibernate对jpa的支持够足量,在使用hibernate ...
- JOptionPane的使用
最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理了一下. 1.1 showMessageDialog 显示一个带有OK 按钮的模 ...
- Oracle教程-安装、结构(一)
本文安装的是Oracle中的11G版本 一. 将文件win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压. 注意:这两个文件解压到 ...
- Flash CS 自定义组件
2012年的时候,做了一些研究,可以后来没有去整理,没有去用到项目里头,现在把这些东西都放出来纪念一下,也给有需要的人作为参考. 基本知识: Flash使用基本知识与ActionScript 3.0的 ...
- Cocos2dx 3.1.1 学习笔记整理(2):创建场景与载入图片
把之前用2.2.3的代码迁移到3.1.1真是个蛋疼的工作,话说3.1.1做的改动还真是大啊. 可以在HelloWorldScene.cpp中看到,之前的各种CCXXX都被废弃了. 例如,新建一个CCL ...
- js动画(三)
咳咳咳咳,感冒了感冒了,鼻塞,蓝瘦啊!嘴巴也开裂,哎,心疼自己.想到这是第三只唇膏了!只怪,放荡不倔爱自由, 行驶在冷风路上么,北风那个吹啊吹啊吹啊,好了,发神经发完了,接下来进入正题,严肃脸.(字数 ...