for (var i = 1; i < 19; i ++) { returnValue += a[18 - i];这部分代码的作用是? 解释一下
select substr('320100780101201',1,6)||'19'||substr('320100780101201',7,9)||'X' from dual
自己琢磨了一下,好像应该是可以了 create or replace function idcard15to18(p_idcard varchar2) return varchar2 is Result varchar2(18); str1 varchar2(6); str2 varchar2(9); str varchar2(100);
i number; r number; r1 number; e varchar2(1);
type myArr is varray(18) of varchar2(100); a myArr:=myArr('','','','','','','','','','','','','','','','','','');begin if length(p_idcard)=15 then r:=0; r1:=0; Result:=''; str := trim(p_idcard); str1 :=substr(str,1,6); str2 := substr(str,7,9);
dbms_output.put_line('str1'||str1||'str2'||str2);
str := str1||'19'||str2;
for i in 1..17 loop a(i) := substr(str,18-i,1); end loop;
for i in 1..17 loop r := r+to_number(a(i))*power(2,i); end loop;
r1 := r mod 11; if(r1<=1)then e:=to_char(1-r1); else e:=to_char(12-r1); end if;
if(a(1)=10) then e:='X'; end if;
for i in 1..17 loop Result :=Result||a(18-i); end loop;
Result:=Result||e; else Result:=p_idcard; end if;
return(Result); end idcard15to18;
to bzszp(SongZip): 这个好像是身份证换算的规则,偶也不懂,只好跟着原来的代码做,我上面贴出来了,测试了几个倒是可以的
a[i] = str.substring((17-i),(18-i));
}
for(var i = 1; i < 18; i ++){
r += parseInt(a[i]) * Math.pow(2,i);
}
r1 = r % 11;
if (r1 <= 1) {
a[0] = 1 - r1;
}
else {
a[0] = 12 - r1;
}
if (a[0] == 10) {
a[0] = 'X';
}
for (var i = 1; i < 19; i ++) {
returnValue += a[18 - i];这部分代码的作用是?
解释一下
create or replace function idcard15to18(p_idcard varchar2) return varchar2 is
Result varchar2(18);
str1 varchar2(6);
str2 varchar2(9);
str varchar2(100);
i number;
r number;
r1 number;
e varchar2(1);
type myArr is varray(18) of varchar2(100);
a myArr:=myArr('','','','','','','','','','','','','','','','','','');begin
if length(p_idcard)=15 then
r:=0;
r1:=0;
Result:='';
str := trim(p_idcard);
str1 :=substr(str,1,6);
str2 := substr(str,7,9);
dbms_output.put_line('str1'||str1||'str2'||str2);
str := str1||'19'||str2;
for i in 1..17 loop
a(i) := substr(str,18-i,1);
end loop;
for i in 1..17 loop
r := r+to_number(a(i))*power(2,i);
end loop;
r1 := r mod 11;
if(r1<=1)then
e:=to_char(1-r1);
else
e:=to_char(12-r1);
end if;
if(a(1)=10) then
e:='X';
end if;
for i in 1..17 loop
Result :=Result||a(18-i);
end loop;
Result:=Result||e;
else
Result:=p_idcard;
end if;
return(Result);
end idcard15to18;
这个好像是身份证换算的规则,偶也不懂,只好跟着原来的代码做,我上面贴出来了,测试了几个倒是可以的