Dynamics AX Knowledge

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

算身份证最后一位--转贴佛吉亚

今天遇到一个问题,根据身份证的前十七位算出第十八位,这个有明确的算法,如下所示:
∑(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))));
}

当然这里没有检查每一个字符是不是有效数字。

posted on 2008-01-09 17:16  Jacky Xu  阅读(1078)  评论(0编辑  收藏  举报