以oracle的function為例
create
orreplace function pid15to18(p_old_pid varchar2) return varchar2 is
v_result varchar2(20);
v_sum number;
begin
if length(p_old_pid) = 15
then
--檢查月份合理性
if substr(p_old_pid, 9, 2) = '00'
or substr(p_old_pid, 9, 2) > '12'
then
return p_old_pid;
endif;
--檢查日合理性
if substr(p_old_pid, 11, 2) = '00' or substr(p_old_pid, 11, 2) > '31' then
return p_old_pid;
endif;--補充出生年19
v_result := substr(p_old_pid, 1, 6) || '19' || substr(p_old_pid, 7);
--根據各位權重,計算校驗位
for i in 1 .. 17 loop
--7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
if i = 1 then
v_sum := to_number(substr(v_result, i, 1)) * 7;
elsif i = 2 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 9;
elsif i = 3 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 10;
elsif i = 4 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 5;
elsif i = 5 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 8;
elsif i = 6 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 4;
elsif i = 7 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 2;
elsif i = 8 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 1;
elsif i = 9 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 6;
elsif i = 10 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 3;
elsif i = 11 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 7;
elsif i = 12 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 9;
elsif i = 13 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 10;
elsif i = 14 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 5;
elsif i = 15 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 8;
elsif i = 16 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 4;
elsif i = 17 then
v_sum := v_sum + to_number(substr(v_result, i, 1)) * 2;
endif;end loop;
v_sum := v_sum mod 11;
if v_sum = 0 then
v_result := v_result || '1';
elsif v_sum = 1 then
v_result := v_result || '0';
elsif v_sum = 2 then
v_result := v_result || 'x';
elsif v_sum = 3 then
v_result := v_result || '9';
elsif v_sum = 4 then
v_result := v_result || '8';
elsif v_sum = 5 then
v_result := v_result || '7';
elsif v_sum = 6 then
v_result := v_result || '6';
elsif v_sum = 7 then
v_result := v_result || '5';
elsif v_sum = 8 then
v_result := v_result || '4';
elsif v_sum = 9 then
v_result := v_result || '3';
elsif v_sum = 10 then
v_result := v_result || '2';
endif; else
v_result := p_old_pid;
endif; return(v_result);
exception
when others then
return p_old_pid;
end pid15to18;
上面的函式,實現了身份證15位轉18位的校驗
可以用於
1. 15位轉18位身份證
2. 18位身份證的校驗
去掉年份的19和校驗位,18位身份證就變成15位了,通過函式轉回18位與原18位判斷即可
身份證校驗
int isright string card cout 9 wi sum 11 if p 17 x p 17 x 最後一位為 x 或 x else if id wi p 17 判斷計算出的身份證校驗碼與輸入是否相符 return error 判斷身份證號碼中的年月日是否正確 bool birthd...
身份證校驗
const regexutils else 手機號碼格式驗證 checkmobile mobile string boolean return regex.test mobile.trim else 郵箱格式驗證 checkemail email string boolean result rege...
js校驗身份證
begin 校驗身份證 function checkidcard formname,inputname,itemname var area alert area parseint idcard.substr 0,2 var y,jym var s,m var idcard array new arr...