求一个校验身份证号码有效性的代码 (转贴)
校验身份证号码中的出生年月日的有效性和末位的有效性。程序代码:
SFZH=[141027197802163033] *-- 判断身份证长度 IF LEN(SFZH)!=18 MESSAGEBOX([身份证号码长度为 ]+TRANSFORM(LEN(SFZH))+[ 位]) ENDIF *-- 判断年 NYEAR=INT(VAL(SUBSTR(SFZH,7,4))) IF NOT BETWEEN(NYEAR,1900,YEAR(DATE())) MESSAGEBOX([身份证 年 错误 【]+TRANSFORM(NYEAR)+[】]) RETURN NYEAR ELSE *-- 判断月 NMONTH=INT(VAL(SUBSTR(SFZH,11,2))) IF NOT BETWEEN(NMONTH,1,12) MESSAGEBOX([身份证 月 错误 【]+TRANSFORM(NMONTH)+[】]) RETURN NMONTH ELSE *-- 判断日 NDAY=INT(VAL(SUBSTR(SFZH,13,2))) RQ=DATE(NYEAR,NMONTH,1) IF NOT BETWEEN(NDAY,1,GOMONTH(RQ,1)-RQ) MESSAGEBOX([身份证 日 错误 【]+TRANSFORM(NDAY)+[】 本月只有 ]+TRANSFORM(GOMONTH(RQ,1)-RQ)+[ 天]) RETURN NDAY ENDIF ENDIF ENDIF *-- 获取校验码 X=[7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2] NUM=0 FOR I=1 TO 17 NUM=NUM+INT(VAL(SUBSTR(SFZH,I,1)))*INT(VAL(GETWORDNUM(X,I,[ ]))) ENDFOR * Y值: 0 1 2 3 4 5 6 7 8 9 10 *校验码: 1 0 X 9 8 7 6 5 4 3 2 XYM=[1 0 X 9 8 7 6 5 4 3 2] CXYM=GETWORDNUM(XYM,MOD(NUM,11)+1,[ ]) &&提取的第18位校验码 MESSAGEBOX([生成的第18位数字为【]+CXYM+[】]+IIF(SUBSTR(SFZH,18,1)==CXYM,[与身份证相符],[与身份证不相符])+[【]+SUBSTR(SFZH,18,1)+[】])