vfp语言编写的两个身份证校验函数

对18位身份证进行校验,15位身份证不进行校验
FUNCTION check1    
parameter sfz
 if len(alltrim(sfz))=18 then
     STORE   0   TO   iRet  
     FOR   i   =   1   TO   17  
      n   =   SUBSTR(sfz,i,1)  
       IF   NOT   ISDIGIT(n)  
         RETURN .F.
      ENDIF  
           n   =   2   ^   (18   -   i)   %   11   *   VAL(n)  
           iRet   =   iRet   +   n  
     ENDFOR  
     iRet   =   iRet   %   11   +   1  
    return SUBSTR("10X98765432",iRet,1)=upper(substr(sfz,18,1)) 
  else
    if len(alltrim(sfz))=15 then
      return .T.
    else
     return .F.
    endif
  endif
  return .T.
endfunc
 
对18,15位身份证都进行校验
FUNCTION   sfzyn  
      LPARAMETERS   lstr     &&参数:lstr   传入的号码  
      LOCAL   lstr,relyn,tsfz  
      LOCAL   m1,m2,m3,m4,m,i,r,c,ai,wi  
      SET   TALK   OFF  
      SET   DATE   TO   ANSI  
      SET   CENT   ON  
      relyn=.F.       &&返回值  
      tsfz=ALLT(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(SUBS(tsfz,i,1))  
              IF   m<48   OR   m>57     &&数字  
                  m2=.F.     &&若有一位不是就不再查  
                  EXIT  
              ENDIF  
          ENDFOR  
          m="19"   +SUBS(tsfz,   7,2)   &&早期的号都是上个世纪的  
          m=m+"."+SUBS(tsfz,   9,2)  
          m=m+"."+SUBS(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(SUBS(tsfz,i,1))  
              IF   m<48   OR   m>57  
                  m2=.F.  
                  EXIT  
              ENDIF  
          ENDFOR  
          m=SUBS(tsfz,7,4)  
          m=m+"."+SUBS(tsfz,11,2)  
          m=m+"."+SUBS(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(SUBS(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"  
              OTHER  
                  c=ALLTRIM(STR(12-r))  
          ENDCASE  
          IF   UPPE(SUBS(tsfz,18,1))<>c  
              m4=.F.   &&校验位与原码最末位不同  
          ENDIF  
      ENDIF  
      *四个条件全成立,则返回.t.  
      relyn=IIF(m1   AND   m2   AND   m3   AND   m4,.T.,.F.)  
      RETU   relyn   
ENDFUN  

你可能感兴趣的:(职场,身份证,校验,休闲,FoxPro)