资源说明: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
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。