思路:先用Alltrim()函数去掉空格,再用Len()函数判断这个身份证号码的长度,长度不是15或18则为输入错误。然后根据不同长度设置不同的校验方法。
对出生日期的校验:与当前日期比较,大于当时日期为错误,离当前日期太近或太远的则进行或有错误提示。日期中的月份不能大于12,日不能大于31。性别校验码必须与输入资料中的性别相符。
如果您事先已经把地区代码保存的数据库中了,那就还可以对这部分号码段进行校验,如:44为广东等。
大概就是这样,如果您想要具体的代码,那就只能对您说抱歉了。
下面的内容是我原来从论坛中拷贝下来的,并未验证过是否正确,也不记得是哪位网友提供的,仅供参考!
身份证号第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