标题:求助身份证号校验程序
只看楼主
ayxzb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-14
 问题点数:0 回复次数:6 
求助身份证号校验程序
如题
搜索更多相关主题的帖子: 身份证 校验 
2006-11-16 10:38
啸凡
Rank: 8Rank: 8
等 级:贵宾
威 望:45
帖 子:1356
专家分:885
注 册:2006-2-22
得分:0 

思路:先用Alltrim()函数去掉空格,再用Len()函数判断这个身份证号码的长度,长度不是15或18则为输入错误。然后根据不同长度设置不同的校验方法。
对出生日期的校验:与当前日期比较,大于当时日期为错误,离当前日期太近或太远的则进行或有错误提示。日期中的月份不能大于12,日不能大于31。性别校验码必须与输入资料中的性别相符。
如果您事先已经把地区代码保存的数据库中了,那就还可以对这部分号码段进行校验,如:44为广东等。
大概就是这样,如果您想要具体的代码,那就只能对您说抱歉了。


两人行已有我师……
2006-11-16 13:45
ayxzb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-14
得分:0 

我说的是当录入18位身份证号时,如何校验身份证号是否正确的程序.

2006-11-16 14:19
啸凡
Rank: 8Rank: 8
等 级:贵宾
威 望:45
帖 子:1356
专家分:885
注 册:2006-2-22
得分:0 
就是用我所说的办法嘛,在输入文本框的LostFocus事件或捕捉Enter键写入验证的程序代码

两人行已有我师……
2006-11-16 16:40
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 

下面的内容是我原来从论坛中拷贝下来的,并未验证过是否正确,也不记得是哪位网友提供的,仅供参考!

身份证号第18位的计算规则,计算一下自己身份证号是很有意义的事!

算法原理
根据〖中华人民共和国国家标准 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
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001x

VFP的算法实现:
**********************************************

Parameters OldId
Local id1,id2,i,NewId
If Type("OldId")#"C"
?? Return
EndIf
id1=Strtran(OldId,' ','')
id2=0
If Len(id1)=15
?? id1=Left(OldId,6)+'19'+Right(OldId,9)
Endif
If Len(id1)=17
?? For i=1 to 17
???? id2=id2+Val(Substr(id1,18-i,1))*(Mod(2^i,11))
?? EndF
?? id1=id1+Iif(Mod(1-id2,11)=10,'X',Str(Mod(1-id2,11),1))?
Endif
NewId=id1
Return NewId


活到老,学到老! http://www. E-mail:hu-jj@
2006-11-16 19:59
ayxzb
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-14
得分:0 

多谢了!
我也只有说谢谢来表达我的意愿了.

2006-11-17 14:41
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
不用谢!这也不是我的原创。

活到老,学到老! http://www. E-mail:hu-jj@
2006-11-17 19:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-103324-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.117022 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved