身份证号码验证课程设计

身份证号码验证课程设计
身份证号码验证课程设计

目录

1 绪论 (1)

1.1课题内容与要求 (1)

1.2需求分析 (1)

1.3操作环境 (1)

2 功能实现设计 (2)

2.1总体设计 (2)

2.1.1程序设计组成框图 (2)

2.1.2数据流图 (2)

2.2详细设计 (3)

2.2.1存放信息设计 (4)

2.2.2构造函数设计 (4)

2.2.3判断信息是否正确 (9)

2.2.4新旧身份证号转换 (13)

2.2.5窗口类的创建及实现 (13)

3 运行结果 (14)

4 总结 (16)

参考文献 (17)

附录 (18)

1 绪论

1.1 课题内容与要求

课题内容

身份证第18位(校验码)的计算方法:

(1)将前面的身份证号码17位分别乘以不同的系数:

从第一位到第十七位的系数分别为:

7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;

(2)将这17位数字和系数相乘的结果相加;

(3)用加出来和除以11,得余数;

(4)余数0-1-2-3-4-5-6-7-8-9-10

对应的最后一位身份证号码为1-0-X-9-8-7-6-5-4-3-2;

身份证号码的第七位到十四位为出生年月日,应符合现实;

课题要求

(1)使用java语言完成本课题的程序设计,并具有一定的深度和难度;

(2)结构化程序设计,源程序要有适当的注释,使程序容易阅读;

(3)能先对问题进行分析然后进行设计最后进行编码的原则。每一步都要有文档产生;

(4)程序一定要做必要的测试和分析,必须得到合理结果;

(5)可适当添加功能,让程序更具有实用性。

(6)提交的所有材料必须符合《长沙理工大学课程设计管理规定》(长理工大[2005]8号)的要求。

1.2 需求分析

本课题主要目的是为了设计一套程序来验证给出的身份证号是否正确,如若正确将身份证号所体现的关键信息性别,年龄,出生日期展现给用户,同时考虑到实实际情况给出了十五位身份证号转十八位,以及十八位转十五位的算法,从而给相关部门机构带来方便。

1.3 操作环境

MyEclipse 8.5

2 功能实现设计

2.1 总体设计

根据上面的分析,将系统分为几大部分:判断身份证号的位数以及每一位是否正确,判断出生年月是否符合实际,根据算法运算对比校验码是否正确,新旧身份证号转换,提取输出关键信息。

2.1.1 程序设计组成框图

2.1.2 数据流图身份证号验证系统

1.接收用户输

入的身份证号,判断位数及每一位是否正确。2.判断出生年

月日时候符

合实际,特别

是二月。

3.运算校验

码,并比较第

十八位时候为

校验码。

4.新旧身份

证号转换。

5.提取输出

关键信息。

开始

N

Y

N Y

N

Y

N

Y

判断位数是否正确

退出系统(报错)

判断每一位是否正确

判断出生年月日是否符合实际

计算校验码

判断校验码是否匹配

十八位转十五位(十五位转十八位)

提取输出关键信息

退出系统

2.2 详细设计

2.2.1存放信息设计

导包,定义一个接口类用于其他类实现,定义个身份证类用于实现接口,定义存放年份,月份,天数,性别,年龄,校验码对应表,校验码,身份证号码,错误标识的容器。

//定义一个接口用于其它类实现

interface IdCardInterFace {

int digitCheck (final String id);//位数检查

boolean charCheck ();//字符检查

boolean dateCheck ();//日期检查

boolean efficacyCode ();//效验码检查

}

//定义个身份证类用于实现接口IdCardInterFace

class IdCard implements IdCardInterFace {

public final static int systemTime = new GregorianCalendar ().get(Calendar.YEAR);//取得当前系统年份

protected int year;//用于存放年份

protected int month;//用于存放月份

protected int date;//用于存放日期天数

protected String sex;//用于存放性别

protected int age;//用于存放年龄

protected HashMap remainGroup;//存放效验码值对应表

private int remainder;//存放效验码

private int totals;//存放每一位字符值与它所对应的加权因子的乘积的和

protected String id;//存放身份证号码

private static int DATE_SIGN;//存放日期错误标志

2.2.2 构造函数设计

之后定义构造函数,检查各项的正确性。特别是二月的检查,要区分平年和闰年,平年二月日期到28号,闰年为29号。构造计算校验码的函数,运用java语言的运算规则,按照给出的校验码计算规则计算校验码。

//定义构造函数

public IdCard (){

}

public IdCard (String id){

this.id = id;

//用于存放效验码对应表

remainGroup = new HashMap ();

remainGroup.put (0, "1");

remainGroup.put (1, "0");

remainGroup.put (2, "X");

remainGroup.put (3, "9");

remainGroup.put (4, "8");

remainGroup.put (5, "7");

remainGroup.put (6, "6");

remainGroup.put (7, "5");

remainGroup.put (8, "4");

remainGroup.put (9, "3");

remainGroup.put (10, "2");

}

//检查位数的正确性

public int digitCheck (final String id){

if (id.length () == 18){

return 18;

}else if (id.length () == 15){

return 15;

}else{

return 0;

}

}

//检查每一位的正确性

public boolean charCheck (){

if (id.length () == 17){

Pattern p = https://www.360docs.net/doc/291147217.html,pile ("[0-9]{17}");

Matcher m = p.matcher (id);

return m.matches ();

}else if (id.length () == 18){

String str = id.substring (0, id.length () - 1);

String str1 = id.substring (id.length () - 1, id.length ());

Pattern p = https://www.360docs.net/doc/291147217.html,pile ("[0-9]{17}");

Matcher m = p.matcher (str);

if ((str1.matches ("\\d") || str1.equals ("X")) && m.matches ()){

return true;

}else{

return false;

}

}else{

Pattern p = https://www.360docs.net/doc/291147217.html,pile ("[0-9]{1,18}");

Matcher m = p.matcher (id);

return m.matches ();

}

}

//检查日期的正确性

public boolean dateCheck (){

year = Integer.parseInt (id.substring (6, 10));//取得年份

//判断年份的正确性

if (year < 1900 || year > IdCard.systemTime - 18){

DATE_SIGN = 1;

return false;

}else

{

month = Integer.parseInt (id.substring (10, 12));//取得月份

//判断月份的正确性

if (month <= 12){

//判断天数的正确性

date = Integer.parseInt (id.substring (12, 14));//取得天数

if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))//判断是否为闰年

{

//判断二月份的天数正确性

if (month == 2){

if (date <= 29){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}else{

//判断其它月份的天数正确性

if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){

return true;

}else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}

}

//判断平年的正确性

else{

//判断二月的天数正确性

if (month == 2){

if (date <= 28){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}else{

//判断其它月份的天数正确性

if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){

return true;

}else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}

}

}else{

DATE_SIGN = 2;

return false;

}

}

}// end of dateCheck

//}

//计算效验码

public int computeEfficacyCode (){

if (id.length () == 18){

for (int i = id.length (); i > 1; i--){

int ai = Integer.parseInt (id.substring (18-i, 19-i));

int wi = (int)Math.pow (2, i-1) % 11;

totals = totals + ai * wi;

}

}

else{

for (int i = id.length () + 1; i > 1; i--){

int ai = Integer.parseInt (id.substring (18-i, 19-i));

int wi = (int)Math.pow (2, i-1) % 11;

totals = totals + ai * wi;

}

}

remainder = totals % 11;

return remainder;

}

2.2.3 判断信息是否正确

对于给定的身份证号,通过调用前面的构造函数,来验证各方面信息是否正确,出生年月日是否符合实际,特别是平年闰年二月的判定,性别的判定,以及由前17位计算出的校验码是否和身份证号的第十八位的匹配。判定过程中运用了很多循环语句,对于错误运用java的异常处理。

//检查日期的正确性

public boolean dateCheck (){

year = Integer.parseInt (id.substring (6, 10));//取得年份

//判断年份的正确性

if (year < 1900 || year > IdCard.systemTime - 18){

DATE_SIGN = 1;

return false;

}else

{

month = Integer.parseInt (id.substring (10, 12));//取得月份

//判断月份的正确性

if (month <= 12){

//判断天数的正确性

date = Integer.parseInt (id.substring (12, 14));//取得天数

if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))//判断是否为闰年

{

//判断二月份的天数正确性

if (month == 2){

if (date <= 29){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}else{

//判断其它月份的天数正确性

if ((month < 8 && month % 2 != 0 && date

<= 31) || (month < 8 && month % 2 == 0 && date <= 30)){

return true;

}else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}

}

//判断平年的正确性

else{

//判断二月的天数正确性

if (month == 2){

if (date <= 28){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}else{

//判断其它月份的天数正确性

if ((month < 8 && month % 2 != 0 && date <= 31) || (month < 8 && month % 2 == 0 && date <= 30)){

return true;

}else if ((month >= 8 && month % 2 == 0 && date <= 31) || (month >= 8 && month % 2 != 0 && date <= 30)){

return true;

}else{

DATE_SIGN = 3;

return false;

}

}

}

}else{

DATE_SIGN = 2;

return false;

}

}

}// end of dateCheck

//}

//计算效验码

public int computeEfficacyCode (){

if (id.length () == 18){

for (int i = id.length (); i > 1; i--){

int ai = Integer.parseInt (id.substring (18-i, 19-i));

int wi = (int)Math.pow (2, i-1) % 11;

totals = totals + ai * wi;

}

}

else{

for (int i = id.length () + 1; i > 1; i--){

int ai = Integer.parseInt (id.substring (18-i, 19-i));

int wi = (int)Math.pow (2, i-1) % 11;

totals = totals + ai * wi;

}

}

remainder = totals % 11;

return remainder;

}

2.2.4 新旧身份证号转换

考虑到现在还确实存在一些旧身份证,特设计了此模块用于新旧身份

证的转换。按照新旧身份证的转换规则,进行新旧身份证号的转换。

//定义一个NewIdCard类用于进行新身份证号码的操作

class NewIdCard extends IdCard{

public String newId;

public StringBuffer oldId;

public NewIdCard (String newId){

super (newId);

this.newId = newId;

}

//用于将新身份证号码转换成旧身份证号码

public void newToOldIdCard (){

oldId = new StringBuffer (newId);

oldId = oldId.delete (6, 8);

oldId = new StringBuffer (oldId.substring (0, oldId.length () - 1));

}

}

2.2.5 窗口类的创建及实现

为了方便用户使用该套程序,创建一个窗口类,便于输入和直观的将结果展现用户眼前。创建窗口类过程中主要是用到了java的组件的相关功能,同时还有事件处理机制,用于鼠标和键盘的输入处理。关键程序如下

//定义个窗口类

class IdCardGui extends Frame{

public Label lb = new Label ();

public JDialog dialog;

public static String strError = null;

private String id;

//初使化对文本框

public JTextField tf1;

public JTextField tf2 = new JTextField ("", 23);

public JTextField tf3 = new JTextField ("", 23);

public JTextField tf4 = new JTextField ("", 23);

public JTextField tf5 = new JTextField ("", 23);

public JTextField tf6 = new JTextField ("", 23);

JButton bt = new JButton ("查询");

3 运行结果图3.1 显示主菜单

图3.2 位数输入错误

图3.3 检查每一位是否正确

图3.4 月份对应日期有误(平年二月无29日)

图3.5 校验码有误

图3.6最终正确运行界面

4 总结

本次课程设计不仅完成了题目要的要求,而且实现了程序的普遍化,能够适应更普遍的情况,而且考虑到实际情况,添加了自己的创新模块,进行十八位十五位互转,在此程序设计过程中用到了java的很多知识,接口,数组,循环语句,容器,异常处理,同时也注意到了代码的优化,针对好多问题进行最优化处理,让代码在通俗易懂的情况下更加简洁。但是程序还是存在一些问题,本来想要将身份证所代表的地区加进去,但是由于地区牵扯到的链接过于复杂,我就放弃了这个想法,但是我认为随着我技术的进步,这个问题会在不久的将来得到解决。

通过这次课程设计,我对java有了更深层次的理解,同时也对java有了更浓厚的兴趣,正应了那句话,一切程序都源于生活,一切程序都服务生活,编代码写程序也是为了给人们的生活带来方便。

参考文献

[1] 印旻. Java与面向对象程序设计教程.北京:高等教育出版社,1999

[2] 张利国,刘伟. Java SE.北京:科学出版社,2008

[3] (美)昊斯特曼(Horstmann,C.S.).Java核心技术.北京:机械工程出版社,2008,5

[4] (美)埃克尔著,陈昊鹏译. Java编程思想(第4版).北京:机械工业出版社,2007,6

[5]李兴华. Java开发实战经典.北京:清华大学出版社,2009,8

附录源程序清单

package kechengsheji0;

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.regex.*;

import javax.swing.text.*;

//定义一个接口用于其它类实现

interface IdCardInterFace {

int digitCheck (final String id);//位数检查

boolean charCheck ();//字符检查

boolean dateCheck ();//日期检查

boolean efficacyCode ();//效验码检查

}

//定义个身份证类用于实现接口IdCardInterFace

class IdCard implements IdCardInterFace {

public final static int systemTime = new GregorianCalendar ().get(Calendar.YEAR);//取得当前系统年份

protected int year;//用于存放年份

protected int month;//用于存放月份

protected int date;//用于存放日期天数

protected String sex;//用于存放性别

protected int age;//用于存放年龄

protected HashMap remainGroup;//存放效验码值对应表

private int remainder;//存放效验码

private int totals;//存放每一位字符值与它所对应的加权因子的乘积的和

protected String id;//存放身份证号码

private static int DATE_SIGN;//存放日期错误标志

//定义构造函数

public IdCard (){

}

public IdCard (String id){

this.id = id;

//用于存放效验码对应表

remainGroup = new HashMap ();

remainGroup.put (0, "1");

remainGroup.put (1, "0");

remainGroup.put (2, "X");

remainGroup.put (3, "9");

remainGroup.put (4, "8");

remainGroup.put (5, "7");

remainGroup.put (6, "6");

remainGroup.put (7, "5");

remainGroup.put (8, "4");

remainGroup.put (9, "3");

remainGroup.put (10, "2");

}

//检查位数的正确性

public int digitCheck (final String id){

if (id.length () == 18){

return 18;

}else if (id.length () == 15){

return 15;

}else{

return 0;

}

}

//检查每一位的正确性

public boolean charCheck (){

if (id.length () == 17){

Pattern p = https://www.360docs.net/doc/291147217.html,pile ("[0-9]{17}");

Matcher m = p.matcher (id);

return m.matches ();

Excel判断身份证号校验码

Excel判断身份证号校验码 假设在一个工作表中:A列是姓名,B列是身份证号码,C列是备注。在B列中输入18位身份证号码后,在C2单元格中输入计算数组公式: =RIGHT(B2,1)=MID("10X98765432",MOD(SUM(MID(B2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1) 然后再将该公式复制给C列其他单元格。 公式的计算结果是一个逻辑值,True表示校验正确,即计算出来的校验码与输入的相同,而False则表示校验错误。值得注意的是,使用校验码进行校验判断为正确的身份证号码未必是正确的,但判断为错误的则肯定是错误的,即通过校验的只是身份证号码正确的必要条件而非充分条件。当然,在实际输入中,身份证号码输入错误而校验正确的情况很少见。在大多数情况下,使用校验码进行校验可以大大提高身份证号码输入的正确性。 RIGHT 根据所指定的字符数返回文本字符串中最后一个或多个字符。 MID 返回文本字符串中从指定位置开始的特定数目的字符,该数目由用户指定。 MOD 返回两数相除的余数。SUM 返回某一单元格区域中所有数字之和。ROW 返回引用的行号。INDIRECT 返回由文本字符串指定的引用。 或者输入数组公式: =IF(LEN(B2)<>18,"错误 ",IF(MID("10X98765432",MOD(SUM(MID(B2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=MID(B2,18,1), "正确","错误"))

身份证号码第十八位效验码的计算方法

身份证号码第十八位效验码的计算方法- godson_h的专栏- CSDN 博客 默认分类2010-04-10 07:56:04 阅读141 评论0 字号:大中小订阅 身份证号码第十八位效验码的计算方法 关于身份证第18是怎么计算的,原理如下:根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 地址码(身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。(所有区域的编码可以到这个网站https://www.360docs.net/doc/291147217.html,/tjbz/index.htm 查询到最新的县及县以上的行政编码资料。) 生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。 顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。 校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。 第十八位数字的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11,看余数是多少? 4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为 1 0 X 9 8 7 6 5 4 3 2。 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 例如:某男性的身份证号码是340524************。我们要看看这个身份证是不是合法的身份证。 首先:我们得出,前17位的乘积和是189 然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。 最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

检验身份证号码的正确性

检验身份证号码的正确性 =IF(LEN(A2)=18,MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:1 7")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2),IF(LEN(A2)=15,ISNUMBER(--TEXT(19&MID(A2,7,6),"#-00-00")))) EXCEL中如何提取身份证出生日期、性别、检验身份证号码的正确性 中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。 18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。 其中3位数字顺序码,是为同一地址码的同年同月同日出生人员编制的顺序号,偶数的为女性,奇数的为男性。 1、提取籍贯地区的行政区划代码(A2为身份证号,下同) 15与18位通用:=LEFT(A2,6) 如果有一个编码和省份地区的对照表,可以用VLOOKUP函数来提取地区信息。 2、提取出生日期信息 15位:=--TEXT(19&MID(A2,7,6),"#-00-00") 18位:=--TEXT(MID(A2,7,8),"#-00-00") 15与18位通用: =--TEXT(IF(LEN(A2)=15,19,"")&MID(A2,7,6+IF(LEN(A2)=18,2,0)),"#-00-00") 简化公式: =--TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00") (请将输入公式的单元格格式设置为日期格式) 3、提取性别信息 15位:=IF(MOD(RIGHT(A2),2)=1,"男","女") 18位:=IF(MOD(MID(A2),17,1)=1,"男","女") 15与18位通用:=IF(MOD(MID(A2,IF(LEN(A2)=15,15,17),1),2)=1,"男","女") 简化公式:=IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女") 4、检验身份证号码的正确性 18位身份证号码的最后一位是检验码,它是根据身份证前17位数字依照规则计算出来的,其值0~9或X。一般情况只要有一位数字输入错误,依照规则计算后就会与第18位数不符。当然不排除按错误号码计算后恰好与检验码相符的情况,但这种情况出现的可能性较低。因此,对18位号码的验证采用如下公式: =MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW(INDIRECT("1:17")),1)*2^(18-R OW(INDIRECT("1:17")))),11)+1,1)=RIGHT(A2,1) 对于15位身份证,由于没有检验码,我们只能简单地去判断出生日期代码是否是一个有效的日期,避免输入一些像“731302”或“980230“等这样不存在的日期。

身份证号码校验实例

身份证号码校验实例 身份证号码是按照一定规律编制的,是个人身份的有效证明,每个人只有一个号码,且不会重复,因而被各单位各部门广泛应用在相关名册中。在大量的身份证号码录入过程中,由于抄写或录入等原因,可能会弄错了某位数字,如果录错了任何一位数字,计算出来的校验码就不一样。根据这一特点,本函数可以对已录入的大批量身份证号码进行校验,如果校验未通过,则说明你录入的号码中必定是某位数字错了,应及时更正,以保证身份证号码正确有效,如果录入的是第一代15位身份证号码,本函数将返回18位号码,使身份证号码保持统一的位数。 代码如下: Function IDcheck(ID) '身份证号码校验函数 Dim s, iAs Integer Dim e, z As String Part1: '----------------------------身份证号码合法性检查--------------------------------------- If Not (Len(ID) = 18 Or Len(ID) = 15) Then '位数检验 IDcheck = "位数错误" Exit Function Else If Len(ID) = 15 Then ID = Left(ID, 6) & "19" & Right(ID, 9)

If IsNumeric(Left(ID, 17)) = False Or InStr(ID, ".") > 0 Then '字符检验 IDcheck = "字符错误" Exit Function End If On Error Resume Next '日期检验 If DateValue(Mid(ID, 7, 4) & "-" & Mid(ID, 11, 2) & "-" & Mid(ID, 13, 2)) < 1 Or _ DateValue(Mid(ID, 7, 4) & "-" & Mid(ID, 11, 2) & "-" & Mid(ID, 13, 2)) > Date Then IDcheck = "日期错误" Exit Function End If End If Part2: '-----------------------------校验码的生成及检查---------------------------------------- s = 0 For i = 1 To 17 s = s + Val(Mid(ID, 18 - i, 1)) * (2 ^ i Mod 11)

中华人民共和国身份证号码规则

18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下: 1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。 3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 校验的计算方式: 1. 对前17位数字本体码加权求和 公式为:S = Sum(Ai * Wi), i = 0, ... , 16 其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2. 以11对计算结果取模 Y = mod(S, 11) 3. 根据模的值得到对应的校验码 对应关系为: Y值:0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2 身份证号码的编排规则 身份证号码中这些数字是怎样排列的,每个数字表示什么意思呢?下面就让我们一起来探索其中的规律吧!新的身份证号码是由18位数字组成的,它们分别表示: (1)前1、2位数字表示:所在省份的代码; (2)第3、4位数字表示:所在城市的代码; (3)第5、6位数字表示:所在区县的代码; (4)第7~14位数字表示:出生年、月、日; (5)第15、16位数字表示:所在地的派出所的代码; (6)第17位数字表示性别:奇数表示男性,偶数表示女性; (7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生, 用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 15位的身份证号 dddddd yymmdd xx p 18位的身份证号 dddddd yyyymmdd xx p y 其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同 yyyymmdd yymmdd 为出生年月日 xx顺号类编码 p性别 18位中末尾的y为校验码,在网上可以找到算法 将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x 中华人民共和国行政区划代码(GB/T2260—999) 代码省、市名称代码省、市名称 11 北京市 42 湖北省

身份证验证

彩色影像扫描仪 全国公民身份信息核查比对服务 操作手册 全国公民身份证号码查询服务中心 2010年7月

目录 1功能介绍 (1) 1.1关于彩色影像扫描仪 (1) 1.2关于全国公民身份信息核查比对服务 (1) 1.2.1服务定义 (1) 1.2.2核查比对结果 (2) 2建议配置 (3) 3扫描仪驱动安装 (4) 3.1硬件驱动程序安装 (4) 3.2扫描仪核心软件安装 (4) 4登录系统 (7) 5安装控件 (8) 5.1添加“可信站点” (8) 5.2“可信站点”自定义设置 (9) 5.3选择服务\安装控件 (10) 6扫描并核查比对 (12) 6.1正确放入证件 (12) 6.2选择证件类型 (12) 6.3扫描并核查比对 (13) 6.4反馈核查比对结果 (14) 6.5手工修改 (14) 7客户服务 (16) 8常见问题解答 (17) 8.1系统登录问题 (17) 8.2扫描仪没有响应 (17) 8.3页面错误导致无法提交 (18) 9特别声明 (20)

感谢您使用全国公民身份证号码查询服务中心提供的身份信息核查比对服务,我们将竭诚为您服务。 防范欺诈风险是你我共同的责任。 1功能介绍 1.1 关于彩色影像扫描仪 此彩色影像扫描仪是全国公民身份证号码查询服务中心监制的一款集扫描、识别、录入、核查比对为一体的专用扫描设备。扫描、识别、录入与我们的核查比对服务绑定在一起一键集成,为客户简化手工录入流程,提高工作效率。 1.2 关于全国公民身份信息核查比对服务 1.2.1服务定义 全国公民身份信息核查比对服务是指公民个人在进行社会和经济活动时,向有关机构主动提交身份证件,有关机构工作人员将公民主动提交的身份号码、姓名等信息传送至“全国公民身份信息系统”(以下简称“系统”)进行比对,系统将提供的数据与存储的数据进行比对后,返回被核查人公民身份号码、姓名与系统存储数据是否一致的结果。在核查比对结果为“一致”的前提下,如果系统存有该被核查人照片,则可以进一步比对照片,不提供任何其他信息。

一个18位身份证校验计算函数.docx

-个18位身份证校验计算函数 因需要对15位旧身份证号码进行升位和校验、查询处理,又没有搜索到现成的函数,于是自己写了一个简单的过程,希望能够帮得上需要的朋友。 本函数的功能单一,只能校验第18位号码是否正确或者取得第18位号码,其他功能留给人家自C扩展吧! <% ' Version: 1. 0. 1 'Author: sfply(sfply@163. com) 'Last Modified: 2004/7/17 12:03 'Src是身份证号码,可以是15位也可以是18位,15位时只能返回验证码方式使用 'iChk参数取值真假,真代表校验Six是否18位身份证,并且校验第18位是否 正确号码而确定是否有效身份证,返冋只值为true或false ' 假代表返回止确的校验码,返回值为(l~x) dim myldentify myTdentify 二〃36050219781218133?〃 response .write chkldentiyCard(myldentify, false) Function chkldentiyCard(Src,iChk)

dim myWi, myAi, mySrc(17), i, myCount myAi =,z 10X98765432' myWi = split(z/7, 9, 10, 5, & 4, 2, 1, 6, 3, 7, 9, 10, 5, & 4, 2〃,〃,〃) if iChk then if len (Src) = 18 then for i = 0 to 16 mySrc(i)二mid(Src, i + 1, 1) myCouni 二myCount + mySrc(i) * myWi(i) next if mid(myAi, (mycount mod 11)+1,1) = right (Src,1) then chkldcntiyCard = true '返回结果,TRUE为合法身份证验证码 el se chkldentiyCard = false '返回结果,FALSE为非法身份证验证码 end if else chkldentiyCard = false '因为不是18位身份证所以返[H] FALSE end if el se if len(Src)二15 or len(Src)二18 then if len(Src) = 15 then Src = mid(Src, 1, 6) & "19〃 & mid(Src, 7, 9) for i = 0 to 16 mySrc(i)二mid(Src, i + 1, 1) myCount 二myCount + mySrc(i) * myWi (i) n ext chkldentiyCard = mid (myAi, (mycount mod 11)+1, 1)'返回正确的验证码else chkldentiyCard二false '输入不不是15位或18位身份证号 end if end if Encl Function

身份证校验码的解释

身份证校验码的解释 新居民身份证的号码是按照国家的标准编制的,由18位组成:前六位为行政区划代码,第七至第十四位为出生日期码,第15至17位为顺序码,第18位为校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。 身份证中第十八位数字的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11,看余数是多少? 4余数只可能有0 、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 例如:某男性的身份证号码是340524************。我们要看看这个身份证是不是合法的身份证。 首先:我们得出,前17位的乘积和是189 然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。 最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

这里面说的很清楚了,最后一位是用来辨别身份证真假的一种办法。而不是同年同月同日生的人的识别码。 贴个JA V A实现的校验算法 public static char doV erify(String id); { char pszSrc[]=id.toCharArray();; int iS = 0; int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char szVerCode[] = new char[]{'1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; int i; for(i=0;i<17;i++); { iS += (int);(pszSrc-'0'); * iW; } int iY = iS%11; return szVerCode[iY]; } =IF(LEN(A101)=15,REPLACE(A101,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLAC E(A101,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),A101 excel计算最后一位的公式,也就是个校验码而已

18位身份证号编制规则

18位身份证号编制规则 一、身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。 二、编码规则:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。其含义如下: 1. 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T22 60的规定执行。 2. 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、2(同上)位数字表示,之间不用分隔符。 3. 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 4.校验码(R),一位数字,通过前17位数字根据一定计算得出。 三、关于地址码含义的详细解释: 身份证前六位是地区代码,我们用ABCDEF表示。代码的解释规则如下: A:国内区域 1 华北三省二市 2 东北三省 3 华东六省一市

4 华南六省 5 西南四省一市 6 西北五省 7 台湾 8 港澳 B(或者说是AB,就是前2位):省(直辖市,自治区,特别行政区)代码 按照A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。 具体省(直辖市,自治区,特别行政区)代码如下: 11-15 京津冀晋蒙 21-23 辽吉黑 31-37 沪苏浙皖闽赣鲁 41-46 豫鄂湘粤桂琼 50-54 渝川贵云藏 61-65 陕甘青宁新 81-82 港澳 CD:城市代码 从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码从省会开始排,比如2101=沈阳2102=大连…… 只有地级城市有独立的城市代码,县级市没有。 EF:市辖区、郊区、郊县、县级市代码

18位身份证号码输入的几种解决方法

18位身份证号码输入的几种解决方法: 1、在A1单元输入号码时,在前面先输入?号,就是:?123456789012345,这样单元格会默认为该单元为文本方式,会完整显示出15个号码来,而不会显示那令人讨厌的科学计数方式来了。 2、如果已经输入了大量的号码,全部以科学计数显示的话,而又懒的按照上面的方法一个一个的重新输入的话,也有这个好方法哦,比如已在单元A1:A100输入了号码,按以下步骤做:》选择单元A1:A100》单击鼠标右键,设置单元格式》选择自定义,在…类型?中输入…0?即可,轻松搞定,呵呵!! 3、还有一种用函数来解决的方法:在A1:A100已经输入大量的号码时,在B1单元中输入:=trim(' 'a1),注意两个?之间是空格,这个公式的意思:先在A1单元15位号码前加个空格符号,然后用trim这个函数把空格符号去掉。输完后,B1单元也是显示出完整的15位数字了。 最佳答案 使WORD里面的文章自动生成目录: 假如文章中标题格式为 第一节……大标题(一级) 1.1……小标题(二级) 1.1.1—……小标题下的小标题(三级) …… 第N节……大标题(一级) n.1……小标题(二级) n.1.1—……小标题下的小标题(三级) 自动生成文章目录的操作: 一、设置标题格式 1.选中文章中的所有一级标题; 2.在“格式”工具栏的左端,“样式”列表中单击“标题1”。 仿照步骤1、2设置二、三级标题格式为标题2、标题3。 二、自动生成目录 1.把光标定位到文章第1页的首行第1个字符左侧(目录应在文章的前面); 2.执行菜单命令“插入/引用/索引和目录”打开“索引的目录”对话框; 3.在对话框中单击“目录”选项卡,进行相关设置后,单击“确定”按钮,文章的目录自动生成完成。 友情提示:

身份证号码校验

Visual C++范例开发大全目录Mylaf 2012-10-23 第1篇VC++入门与基本文档视图 第1章Visual C++ 6.0 MFC程序设计快速入门 2 1.1 Visual C++ 6.0开发环境简介2 1.2 创建Visual C++ 6.0应用程序3 实例001 创建第一个MFC应用程序 3 实例002 创建第一个C++应用程序 4 第2章文档视图应用程序实例6 2.1 窗体操作6 实例003 实现启动时无子窗口的MDI程序 6 实例004 实现MDI应用程序启动时子窗口默认最大化7 实例005 MDI应用程序启动时主窗口默认最大化8 实例006 具有图片背景的MDI主窗口9 实例007 全屏显示的窗体12 实例008 创建带滚动条的窗体15 实例009 窗体拆分16 实例010 始终置顶的SDI程序17 实例011 不可移动的窗体18 实例012 创建不可改变大小的SDI窗口19 实例013 动态设置窗口位置和大小20 实例014 保存窗口状态21 实例015 双击主窗口弹出“打开”对话框23 2.2 标题栏25 实例016 获取标题栏高度25 实例017 获取标题栏上按钮的尺寸26 实例018 定制标题栏文字27 实例019 添加标题栏右键菜单项28 实例020 屏蔽标题栏右键系统菜单及隐藏按钮29 实例021 禁用标题栏上的最大化、最小化和关闭按钮30 实例022 显示和隐藏标题栏31 2.3 菜单32 实例023 获取菜单栏高度32 实例024 启用和禁用菜单33 实例025 动态添加菜单35 实例026 带单选标记的菜单36 实例027 复选标记的菜单38 实例028 带图标菜单的SDI程序39 实例029 带图标菜单的MDI 40 实例030 位图菜单41 实例031 创建客户区右键菜单43 实例032 隐藏和显示菜单栏44 实例033 为应用程序添加多语言支持45 2.4 工具栏48 实例034 工具栏按钮的添加、删除和分组48 实例035 不能停靠的工具栏48 实例036 下压式工具栏按钮49 实例037 给工具栏添加图像背景50 实例038 动态隐藏和显示工具栏51 2.5 状态栏52 实例039 显示和隐藏状态栏52 实例040 带进度条的状态栏53 实例041 在状态栏上加载图像54 实例042 滚动字幕的状态栏56 第3章对话框应用实例58 3.1 对话框界面58 实例043 设置对话框应用程序窗口启动位置58 实例044 半透明对话框59 实例045 创建不规则对话框应用程序60 实例046 拖动没有标题栏的对话框61 实例047 实现收缩对话框应用程序62 实例048 基于对话框的托盘程序64 实例049 为对话框应用程序添加菜单栏66 实例050 带有工具栏的对话框应用程序67 实例051 为对话框应用程序添加右键菜单68 实例052 模式对话框与非模式对话框69 实例053 属性页对话框71 实例054 向导式对话框72 实例055 为对话框应用程序添加启动界面73 实例056 为对话框应用程序添加百叶窗的启动界面76 3.2 通用对话框77 实例057 文件打开对话框78 实例058 在程序启动时弹出文件打开对话框79 实例059 在文件打开对话框中预览图片80 实例060 文件保存对话框81 实例061 选择文件夹对话框82 实例062 字体对话框84 实例063 颜色对话框86 实例064 查找与替换对话框87 第4章控件应用实例89 4.1 常见控件89 实例065 图文按钮89 实例066 具有随机图片背景的EditBox控件90 实例067 使用List Box显示系统逻辑磁盘驱动器列表92 实例068 利用列标题对列表视图进行数据排序93 实例069 使用Static Text控件显示当前系统时间95 实例070 使用Data Time Picker控件调整系统时间96 实例071 使用Combo Box控件控制字体大小97 实例072 使用Rich Edit控件显示文本文件98 实例073 使用Tree Control控件显示文件目录100 实例074 位图进度条102 实例075 使用Progress控件实现文字进度条103 实例076 使用Static Text控件显示当前时间104 实例077 使用Picture Box显示动态打开图像106 实例078 使用Group Box控件对控件分组107 实例079 使用Check Box实现多选109 实例080 使用Radio Button实现单选110 实例081 HorizontalScrollBar,VerticalScrollBar滚动条111

一个18位身份证校验计算函数

一个18位身份证校验计算函数 因需要对15位旧身份证号码进行升位和校验、查询处理,又没有搜索到现成的函数,于是自己写了一个简单的过程,希望能够帮得上需要的朋友。 本函数的功能单一,只能校验第18位号码是否正确或者取得第18位号码,其他功能留给大家自己扩展吧! <% ' Version: 1.0.1 ' Author: sfply(sfply@https://www.360docs.net/doc/291147217.html,) ' Last Modified: 2004/7/17 12:03 ' Src是身份证号码,可以是15位也可以是18位,15位时只能返回验证码方式使用 ' iChk参数取值真假,真代表校验Src是否18位身份证,并且校验第18位是否正确号码而确定是否有效身份证,返回只值为true或false ' 假代表返回正确的校验码,返回值为(1~x) dim myIdentify myIdentify = "36050219781218133?" response.write chkIdentiyCard(myIdentify,false) Function chkIdentiyCard(Src,iChk) dim myWi,myAi,mySrc(17),i,myCount

myAi = "10X98765432" myWi = split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2",",") if iChk then if len(Src) = 18 then for i = 0 to 16 mySrc(i) = mid(Src,i+1,1) myCount = myCount + mySrc(i) * myWi(i) next if mid(myAi,(mycount mod 11)+1,1) = right(Src,1) then chkIdentiyCard = true '返回结果,TRUE为合法身份证验证码 else chkIdentiyCard = false '返回结果,FALSE为非法身份证验证码 end if else chkIdentiyCard = false '因为不是18位身份证所以返回FALSE end if else if len(Src) = 15 or len(Src) = 18 then if len(Src) = 15 then Src = mid(Src,1,6) & "19" & mid(Src,7,9) for i = 0 to 16 mySrc(i) = mid(Src,i+1,1) myCount = myCount + mySrc(i) * myWi(i) next chkIdentiyCard = mid (myAi,(mycount mod 11)+1,1) '返回正确的验证码 else chkIdentiyCard = false '输入不不是15位或18位身份证号 end if end if End Function

18位身份证号码验证算法

‘算法为Excel表中用VBA实现身份证号码验证。只验证身份证号码正确否,不验证是否存在此身份证号码。算法思想可普遍适用其他地方。 Sub 身份证号码验证算法() Dim sfzArray(1 To 18) As Integer ‘身份证号码数组,数组每个元素记录每一位号码 Dim sfzPointer As Integer’身份证位数指针,指向每一位号码 Dim checkStart As Long’需验证的起始位置,Excel中第一个身份证号码行号 Dim checkEnd As Long’需验证的最后位置,Excel中最后一个身份证号码行号 Dim checkPointer As Long’验证指针,指向验证的位置 Dim sfzSum As Integer’身份证位数求和 Dim checkWord As String’校验位 Dim initialV alue As String’Excel表中身份证号码初始值 checkStart=2’根据实际情况修改 checkEnd=50000’根据实际情况修改 For checkPointer= checkStart To checkEnd initialV alue = CStr(Cells(checkPointer, 1))’默认Excel表第一列是身份证号码,根据实际情况修改 sfzSum = 0’初始化 For sfzPointer = 1 To 17 sfzArray(sfzPointer) = CInt(Mid(initialV alue, sfzPointer, 1))’对应位赋值给身份证号码数组 Select Case sfzPointer’根据位数不同,求和 Case 1, 11 sfzSum = sfzSum + sfzArray (sfzPointer) * 7 Case 2, 12 sfzSum = sfzSum + sfzArray (sfzPointer)* 9 Case 3, 13 sfzSum = sfzSum + sfzArray (sfzPointer) * 10 Case 4, 14 sfzSum = sfzSum + sfzArray (sfzPointer) * 5 Case 5, 15 sfzSum = sfzSum + sfzArray (sfzPointer)* 8 Case 6, 16 sfzSum = sfzSum + sfzArray (sfzPointer) * 4 Case 7, 17 sfzSum = sfzSum + sfzArray (sfzPointer) * 2 Case 8 sfzSum = sfzSum + sfzArray (sfzPointer) * 1 Case 9 sfzSum = sfzSum + sfzArray (sfzPointer) * 6 Case 10 sfzSum = sfzSum + sfzArray (sfzPointer) * 3 End Select Next sfzPointer sfzSum = sfzSum Mod 11 Select Case sfzS um’根据求模后的余数,可得校验位 Case 0 checkWord = 1 Case 1 checkWord = 0 Case 2 checkWord = "X" Case 3 checkWord = 9 Case 4 checkWord = 8

最新-身份证号码变更证明 精品

身份证号码变更证明 篇一:公民身份证号码变更证明公民身份号码更正证明当事人姓名:当事人住址:--------------------更正前公民身份号码---------------更正后公民身份号码----------------更正原因:------申请人住址:------申请理由:----------申请人签名:-----------联系电话:-----------经办人:更正日期:-年-月-日派出所会电脑打印出一份你的户籍证明,上面有你的详细户籍资料,同时派出所在上面再注明,此人原来的身份证号码是,现在的身份证号码是,这两个号码是属于同一个人,盖上派出所章子就行了。 公民身份证号码变更证明本辖区公民_______(曾用名_______),住址:_________________。 原使用的公民身份证号码为:系______________________(原因)。 根据《中华人民共和国居民身份证法》的有关规定及公民身份证号码的编制原则,为确保公民身份证号码的准确性和惟一性,自_______年_____月_____日起将原号码更改为:特此证明。 (县级公安机关名称并盖户口专用章)年月日注:请为申请人____________办理公民身份证号码变更的相关事宜。 此件为原件,如需要请留存复印件。 发函单位联系电话:篇二:公民身份证号码更改证明公民身份证号码更改证明本辖区公民_________(曾用名______)住址_____________________________________________________。 原使用公民身份证号码为:系(重错号)。 根据中华人民共和国居民身份证法的有关规定及公民身份证号码的编制原则,为确保公民身份证号码的准确性和唯一性,自_______年____月____日起将原号码更正为:特此证明。 (县级公安机关名称并盖户口专用章)年月日注:请为申请人_____________办理公民身份证号码变更的相关理宜,此件为原件,如需要请留存复印件。 篇三:身份证号变更证明身份证号变更证明身份证号变更证明公民身份证号码变更证明本辖区居民:性别:民族住址:原使用的公民身份证号码为□□□□□□□□□□□□□□□□□□系(重错号)。

身份证编码规则

中国公民身份证编号规则 一、身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施 的GB11643-1999《公民身份号码》。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号 码》从实施之日起代替GB11643-1989。 二、编码规则:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。其含义如下: 1. 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码, 按GB/T2260的规定执行。 2. 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、2位(同上)数字表示,之间不用分 隔符。 3. 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生 的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 4.校验码(R),一位数字,通过前17位数字根据一定计算得出。 第17位数字是表示在前16位数字完全相同时,某个公民的顺序号,并且单数用于男性,双数用于女性。如果前16位数字均相同的同性别的公民超过5人,则可以“进位”到第16位。比如:有6位女性公民前16位数字均相同,并假设第16位数是7,则这些女性公民的末两位编号分别为72,74,76,78,80,82。另外,还特殊规定,最后三位数为996,997,998,999这4个号码为百岁老人的代码,这4个号码将不再分配给任何派出所。

C实现18位身份证号码格式验证与信息识别算法

C#实现18位身份证号码格式验证与信息识别算法 首先是算法依据: 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下: 一、范围 该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。 二、编码对象 公民身份号码的编码对象是具有中华人民共和国国籍的公民。 三、号码的结构和表示形式 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 2、地址码 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 3、出生日期码 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 4、顺序码 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 5、校验码 (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和 Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (2)计算模 Y = mod(S, 11) (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2 下面是具体的算法源代码和注释: using System; using System.Collections.Generic; using System.Linq; using System.Text;

身份证正确检验及验证公式

验证公式一 =IF(LEN(H20)=18,IF(RIGHT(H20,1)="X",IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18) )*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11) 1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1)),"正确!","出错啦! "),IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18))*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11) 1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1))*1,"正确!","出错啦!")),IF(LEN(H20)=15,"老号,请注意!",IF(LEN(H20)=0,"缺号码","位数不对!"))) 验证公式二 =MID("10X98765432",MOD(SUMPRODUCT(MID(H20,ROW(INDIRECT("1:17")),1)*2^(18 -ROW(INDIRECT("1:17")))),11) 1,1)=RIGHT(H20,1) 身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。但身份证上的日期是否合法:月份是否在1-12之间,日期是否在1-31之间,并且2月份只有28或29天,其他月份30或31天,都不能超过范围。另外一般规定6岁以上才可以办理身份证,也就是年份也有一个超范围的可能性。综合起来看,有三类错误:“身份证位数不对”、“月日错误”、“年份错误”。 假定身份证号码在B1单元格,下面的公式可以综合判断以上三种错误: 验证公式三 =IF(OR(LEN(B1)=18,LEN(B1)=15),IF(LEN(B1)=18,IF(OR(MONTH(DATE(1*(MID(B1,7 ,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,11,2)),DAY(DATE(1*(M ID(B1,7,4)),1*(MID(B1,11,2)),1*(MID(B1,13,2))))<>1*(MID(B1,13,2))),"月日错误",""),IF(LEN(B1)=15,IF(OR(MONTH(DATE(1*(MID(B1,7,2)) 1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,9,2)),DAY(DATE(1*(MID (B1,7,2)) 1900,1*(MID(B1,9,2)),1*(MID(B1,11,2))))<>1*(MID(B1,11,2))),"月

相关文档
最新文档