请老师给分析一个关于身份证号检测程序
Function MyIdentityCardVerify &&校验身份证号是否合法Lparameters lstr &&参数:lstr 传入的号码
Private lstr,relyn,tsfz,m1,m2,m3,m4,m,I,r,c,ai,wi
relyn=.F. &&返回值
tsfz=Alltrim(lstr)
*分别用m1,m2,m3,m4表示四个条件是否成立
Stor .T. To m1,m2,m3,m4
*条件1:只能是15或18位
m1=Iif(Len(tsfz)=15 Or Len(tsfz)=18,.T.,.F.)
If Len(tsfz)=15 && 15位的号码
For I=1 To 15 &&检查每一位是否为数字
m=Asc(Substr(tsfz,I,1))
If m<48 Or m>57 &&数字
m2=.F. &&若有一位不是就不再查
Exit
Endif
Endfor
m="19" +Substr(tsfz, 7,2) &&早期的号都是上个世纪的
m=m+"."+Substr(tsfz, 9,2)
m=m+"."+Substr(tsfz,11,2)
m=Ctod(m)
If Isnull(m) Or Isblank(m)
m3=.F. &&生日不正确
Endif
Endif
If Len(tsfz)=18 && 18位的号码
For I=1 To 17
m=Asc(Substr(tsfz,I,1))
If m<48 Or m>57
m2=.F.
Exit
Endif
Endfor
m=Substr(tsfz,7,4)
m=m+"."+Substr(tsfz,11,2)
m=m+"."+Substr(tsfz,13,2)
m=Ctod(m)
If Isnull(m) Or Isblank(m)
m3=.F.
Endif
r=0 &&计算校验位
For I=18 To 2 Step -1
ai=Val(Substr(tsfz,19-i,1))
wi=Mod(2^(i-1),11)
r=r+ai*wi
Next
r=Mod(r,11)
Do Case
Case r=0
c="1"
Case r=1
c="0"
Case r=2
c="X"
Otherwise
c=Alltrim(Str(12-r))
Endcase
If Upper(Substr(tsfz,18,1))<>c
m4=.F. &&校验位与原码最末位不同
Endif
Endif
*四个条件全成立,则返回.t.
relyn=Iif(m1 And m2 And m3 And m4,.T.,.F.)
Return relyn
Endfunc
其中红色部分检测身份证时不能通过,不知为什么,请老师指点!
[ 本帖最后由 shyibaoban 于 2010-10-19 23:50 编辑 ]