|
Re: sas 有验证身份证号码是否真实的函数吗
这东西都知道~
[quote="MerlinZHOU":2b666xm8][code:2b666xm8]
/************************************************************************************************************************************
程序介绍
第一部分 算法
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
5、通过上面得知如果余数是2,身份证的最后一位号码就是罗马数字x。如果余数是10,就会在身份证的第18位数字上出现的是2。
例如:某男性的身份证号码是oooooooooooooooooX。我们要看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和是189,然后用189除以11得出的结果是17+2/11,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的是罗马数字X。
所以,可以判定这是一个合格的身份证号码。
第二部分 在数据集one中,变量id是身份证号码。
*************************************************************************************************************************************/
data two;
set one;
a=7*substr(id,1,1)+9*substr(id,2,1)+10*substr(id,3,1)+5*substr(id,4,1)+8*substr(id,5,1)+4*substr(id,6,1)+2*substr(id,7,1)
+1*substr(id,8,1) +6*substr(id,9,1)+3*substr(id,10,1)+7*substr(id,11,1)+9*substr(id,12,1)+10*substr(id,13,1)+5*substr(id,14,1)
+8*substr(id,15,1)+4*substr(id,16,1)+2*substr(id,17,1);
b=mod(a,11);
c=substr(id,18,1);
select (b);
when (0) do;
if c="1" then d="right";
else d="wrong";
end;
when (1) do;
if c="0" then d="right";
else d="wrong";
end;
when (2) do;
if c="x" then d="right";
else d="wrong";
end;
when (3) do;
if c="9" then d="right";
else d="wrong";
end;
when (4) do;
if c="8" then d="right";
else d="wrong";
end;
when (5) do;
if c="7" then d="right";
else d="wrong";
end;
when (6) do;
if c="6" then d="right";
else d="wrong";
end;
when (7) do;
if c="5" then d="right";
else d="wrong";
end;
when (8) do;
if c="4" then d="right";
else d="wrong";
end;
when (9) do;
if c="3" then d="right";
else d="wrong";
end;
when (10) do;
if c="2" then d="right";
else d="wrong";
end;
otherwise;
end;
run;
[/code:2b666xm8][/quote:2b666xm8] |
|