VFP 15位升18位身份证号码 [原创]
decl a(18),b(11) && 定义2个数组
******** a[i]数组表示第i位加权因子
a(1)=7
a(2)=9
a(3)=10
a(4)=5
a(5)=8
a(6)=4
a(7)=2
a(8)=1
a(9)=6
a(10)=3
a(11)=7
a(12)=9
a(13)=10
a(14)=5
a(15)=8
a(16)=4
a(17)=2
******** b[i]数组表示校验码字符值
b(1)='1'
b(2)='0'
b(3)='X'
b(4)='9'
b(5)='8'
b(6)='7'
b(7)='6'
b(8)='5'
b(9)='4'
b(10)='3'
b(11)='2'
***********升位计算开始**********
xhm=SUBSTR(ALLTRIM(thisform.text1.Value),1,6)+'19'+SUBSTR(ALLTRIM(thisform.text1.Value),7,9)
*↑* 上面是把15位身份证号码加上'19' ,表示19xx年。得到17位新号码.
s=0
y=0
FOR i=1 TO 17 &&用前17位数字计算出第18位身份证号码
wi=VAL(SUBSTR(ALLTRIM(xhm),i,1)) &&从17位号码里第取第i位号码并转换成数字型。
s=s+a(i)*wi &&用第i位的加权因子 乘 第i位身份证号码,并求和。
next
y=MOD(s,11) &&取计算出来的余数,根据这个数判断第18位号码是多少。
xhm=xhm+ALLTRIM(b(y+1)) &&组合18位身份证号码。
*↑* 上面的y必须加1,因为计算出来的余数是0.1.2.3.4.5.6.7.8.9.10的其中一个,
*↑* 而定义检验码数组的时候,是从a(1)开始的(好像不能从a(0)开始定义)
thisform.text2.Value=xhm
***********升位计算结束**********
纯手功,根据地升份证升位计算原理。写出来与大家分享。
[解决办法]
FUNC sfjy
PARA msfz
*ON ERRO RETU ""
PRIV msfz,sn,i,dic
dic= "0709100508040201060307091005080402"
msfz=ALLT(msfz)
*出生日期预处理,仅接受15或18位字符串
DO CASE
CASE LEN(msfz)=15
IF RIGHT(msfz,3)$ "996,997,998,999"
msfz=LEFT(msfz,6)+ "18"+SUBS(msfz,7)
ELSE
msfz=LEFT(msfz,6)+ "19"+SUBS(msfz,7)
ENDI
CASE LEN(msfz)=18
msfz=LEFT(msfz,17)
OTHE
RETU ""
ENDC
*检查身份证号字符的合法性
FOR i=1 TO 17
IF !ISDI(SUBS(msfz,i,1))
RETU ""
ENDI
ENDF
*检查行政区划合法性
IF !LEFT(msfz,2)$ "11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82"
RETU ""
ENDI
*检查出生日期合法性
IF EMPT(DATE(VAL(SUBS(msfz,7,4)),VAL(SUBS(msfz,11,2)),VAL(SUBS(msfz,13,2))))
RETU ""
ENDI
*生成校检码
sn=0
FOR i=1 TO 17
sn=sn+VAL(SUBS(msfz,i,1))*VAL(SUBS(dic,i*2-1,2))
ENDF
sn=MOD(sn,11)
ON ERRO
RETU msfz+SUBS( "10X98765432",sn+1,1)
[解决办法]
<关于身份证号码>
http://blog.csdn.net/apple_8180/article/details/941626
[解决办法]
结验证,结果完全正确