算身份证最后一位--转贴佛吉亚
今天遇到一个问题,根据身份证的前十七位算出第十八位,这个有明确的算法,如下所示:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示号码字符从右至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi---表示每一位对应的加权值。
从左到右Wi的值依次为:
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
然后根据公式(1)计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
公式计算结果 0 1 2 3 4 5 6 7 8 9 10
校验码字符值 1 0 X 9 8 7 6 5 4 3 2
这个算法实现起来倒是挺简单的,用X++里的Container比较顺手:
static void GetLastNumber(str strIdentity)
{
Container factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
Container c = [1,0,'X',9,8,7,6,5,4,3,2];
int i;
int j;
;
if(strlen(strIdentity)!=17)
throw info("请输入17位有效数字!");
for(i=1;i<=17;i++)
j += str2int(substr(strIdentity,i,1))*conpeek(factor,i);
j = j mod 11;
Box::info(strfmt("您身份证最后一位是:%1",j==2? conpeek(c,j+1):int2Str(conpeek(c,j+1))));
}
{
Container factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
Container c = [1,0,'X',9,8,7,6,5,4,3,2];
int i;
int j;
;
if(strlen(strIdentity)!=17)
throw info("请输入17位有效数字!");
for(i=1;i<=17;i++)
j += str2int(substr(strIdentity,i,1))*conpeek(factor,i);
j = j mod 11;
Box::info(strfmt("您身份证最后一位是:%1",j==2? conpeek(c,j+1):int2Str(conpeek(c,j+1))));
}
当然这里没有检查每一个字符是不是有效数字。