中国大陆18位身份证号码校验函数
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
* 程序:中国大陆18位身份证号码校验函数
* 作者:宋祎礽
* 公司:SYRSOFT(R) 上海 中国
* 版权所有(C)宋祎礽 保留所有权利
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
* 语法:IdVerify(cExpression [,nModel])
* 参数:
* cExpression
* 指定要校验的18位身份证号。若cExpression参数缺省或为空字符串
* 或为非18位身份证号,则返回逻辑.F.值。
* nModel
* 指定返回值类型。若nModel参数缺省或为0,则返回值为逻辑型,表
* 示校验码是否正确;1 则返回值为字符型,表示正确的校验码。
* 返回值类型:逻辑型、字符型
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
FUNCTION IdVerify
PARAMETERS cIdNumber,nModel
LOCAL lcCorrect,cVerify,nSummary,i
LOCAL ARRAY aPosition(17)
lcCorrect=.F.
IF TYPE('cIdNumber')#'C' &&若证件号参数类型不符
RETURN lcCorrect
ELSE
IF LEN(cIdNumber)#18 &&若非18位身份证号
RETURN lcCorrect
ENDIF
ENDIF
IF TYPE('nModel')#'N' &&检查并纠正模式参数
nModel=0
ELSE
IF BETWEEN(nModel,0,1)=.F.
nModel=0
ENDIF
ENDIF
*定义加权因子数组*
aPosition(1)=7
aPosition(2)=9
aPosition(3)=10
aPosition(4)=5
aPosition(5)=8
aPosition(6)=4
aPosition(7)=2
aPosition(8)=1
aPosition(9)=6
aPosition(10)=3
aPosition(11)=7
aPosition(12)=9
aPosition(13)=10
aPosition(14)=5
aPosition(15)=8
aPosition(16)=4
aPosition(17)=2
cVerify='10X98765432' &&定义对应校验码变量
nSummary=0
FOR i=1 TO 17
nSummary=nSummary+VAL(SUBSTR(cIdNumber,i,1))*aPosition(i)
ENDFOR
DO CASE
CASE nModel=0 &&验证校验码模式
IF UPPER(RIGHT(cIdNumber,1))=SUBSTR(cVerify,MOD(nSummary,11)+1,1)
lcCorrect=.T.
ELSE
lcCorrect=.F.
ENDIF
CASE nModel=1 &&请求校验码模式
lcCorrect=SUBSTR(cVerify,MOD(nSummary,11)+1,1)
ENDCASE
RETURN lcCorrect
ENDFUNC