用Delphi实现身份证15位升18位的算法
将15位身份证补全为18位身份证的算法示例详解
将15位⾝份证补全为18位⾝份证的算法⽰例详解前⾔最近在参与⼀个银⾏项⽬-某银⾏安防系统-反洗钱需求的开发,银⾏项⽬的离不开⾝份证号码,⾝份证号码作为我国公民的唯⼀标识,有这⾮同寻常的意义,由于业务的要求15位的⾝份证号码⽆法命中,所以需要补全为18位,⼀开始⾃⼰想着加个年份的前两位,后⾯再加个X不就⾏了嘛,后来代码写不下去了,上⽹查了资料,才知道⾃⼰想的是多么天真,还是⽐较复杂的,折腾了⼀下午终于有了眉⽬。
⼀、15位⾝份证和18位⾝份证号码结构介绍要进⾏⾝份证号码的验证,⾸先需要了解我国⾝份证号码的编码规则。
我国⾝份证号码多由若⼲位数字或者数字与字母混合组成。
早期⾝份证由15位数字构成,这主要是在1980年以前发放的⾝份证,后来考虑到千年⾍问题,因为15位的⾝份证号码只能为1900年1⽉1⽇到1999年12⽉31⽇出⽣的⼈编号,所以⼜增加了18位⾝份证号码编号规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15A A A A A A Y Y M M D D N N S前六位AAAAAA是⾝份证编码对象的所在地(出⽣地)的编码,该号码可由国家统计局公布的相关标准中得到。
YY表⽰出⽣年的后两位,MM和DD表⽰出⽣⽉和⽇,不⾜两位的⾼位补0,NNS为顺序号,⽆法确定。
S为性别识别码,男性为奇数,⼥性为偶数。
了解了这些,再来写代码就变得容易多了。
⼆、算法实现了解了⾝份证号码的规则后,我们就可以推断出,⾝份证的15位转化位需要两步。
⾸先把15位⾝份证号补全为17位,然后再补全最后⼀位。
但是最后⼀位是数字还是字母X?这⾥⼜出现了问题。
我们知道,⾝份证的最后⼀位为校验位,那么最后⼀位是怎么得到的呢?原来,最后⼀位是由数字1-9组成,超过9的⽐如11就⽤字母X表⽰,否则号码就变成了19位。
了解了这些,经过整理得出⾝份证补全算法实现思想如下:step1、将15位⾝份证号码加⼊出⽣年变为17位 step2、将step1得到的⾝份证17位数分别乘以不同的系数。
15位身份证补全为18位身份证算法
15位⾝份证补全为18位⾝份证算法 最近在参与⼀个项⽬需求的开发,其中涉及到了⾝份证号码,⾝份证号码作为我国公民的唯⼀标识,有着⾮同寻常的意义,由于业务的要求15位的⾝份证号码⽆法命中,所以需要补全为18位,⼀开始⾃⼰想着加个年份的前两位,后⾯再加个X不就⾏了嘛,后来代码写不下去了,上⽹查了资料,才知道⾃⼰想的是多么天真,还是⽐较复杂的,折腾了⼀下午终于有了眉⽬。
⼀、15位⾝份证和18位⾝份证号码结构介绍要进⾏⾝份证号码的验证,⾸先需要了解我国⾝份证号码的编码规则。
我国⾝份证号码多由若⼲位数字或者数字与字母混合组成。
早期⾝份证由15位数字构成,这主要是在1980年以前发放的⾝份证,后来考虑到千年⾍问题,因为15位的⾝份证号码只能为1900年1⽉1⽇到1999年12⽉31⽇出⽣的⼈编号,所以⼜增加了18位⾝份证号码编号规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15A A A A A A Y Y M M D D N N S前六位AAAAAA是⾝份证编码对象的所在地(出⽣地)的编码,该号码可由国家统计局公布的相关标准中得到。
YY表⽰出⽣年的后两位,MM和DD表⽰出⽣⽉和⽇,不⾜两位的⾼位补0,NNS为顺序号,⽆法确定。
S为性别识别码,男性为奇数,⼥性为偶数。
了解了这些,再来写代码就变得容易多了。
⼆、算法实现了解了⾝份证号码的规则后,我们就可以推断出,⾝份证的15位转化位需要两步。
⾸先把15位⾝份证号补全为17位,然后再补全最后⼀位。
但是最后⼀位是数字还是字母X?这⾥⼜出现了问题。
我们知道,⾝份证的最后⼀位为校验位,那么最后⼀位是怎么得到的呢?原来,最后⼀位是由数字1-9组成,超过9的⽐如11就⽤字母X表⽰,否则号码就变成了19位。
了解了这些,经过整理得出⾝份证补全算法实现思想如下:step1、将15位⾝份证号码加⼊出⽣年变为17位 step2、将step1得到的⾝份证17位数分别乘以不同的系数。
15位转换18位
一、假设15位号码在C列,(1)在D列中输入数组公式(公式输入后须同时按下Ctrl+Shift+Enter组合键方可完成=IF(LEN(C2)=15,REPLACE(C2,7,,19)&MID("10X98765432",MOD(SUM(MID( REPLACE(C2,7,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1 :17")))),11)+1,1),C2);(2)=IF(LEN(C2)=15,REPLACE(C2,7,,19)&MID("10X98765432",MOD(SUM(MID( REPLACE(C2,7,,19),{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17},1)*{7,9,10,5,8,4,2, 1,6,3,7,9,10,5,8,4,2}),11)+1,1),C2)&""二、15位的老身份证号码插入年份即可升到17位,假设15位号码在C列,在D列输入公式=IF(LEN(C6)=15,MID(C6,1,6)&"19"&MID(C6,7,9))就可以在年份前添加19。
假设17位号码在C列,在D列中输入数组公式(公式输入后须同时按下Ctrl+Shift+Enter组合键方可完成):=C6&LOOKUP(MOD(SUM(MID(C6,ROW($1:$17),1)*MOD(2^(18-ROW($1:$17)) ,11)),11),{0,1,2,3,4,5,6,7,8,9,10},{1,0,"X",9,8,7,6,5,4,3,2})即可得到18位(上述公式为函数大师陈军的作品)。
参考资料:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
身份证验证及18与15之间转化
//身份证号系统#include <iostream>using namespace std;int main(){int n,i,y,m,s;int x[20];char a[20],b[15];x[1]=7;x[2]=9;x[3]=10;x[4]=5;x[5]=8;x[6]=4;x[7]=2;x[8]=1;x[9]=6;x[10]=3;x[11]=7;x[12]=9;x[13]=10;x[14]=5;x[15]=8;x[16]=4;x[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';b[7]='5';b[8]='4';b[9]='3';b[10]='2';do{cout<<"================================================================="<< endl;cout<<"==========================身份证号码验证程序====================="<< endl;cout<<"================================================================="<< endl;cout<<" 身份证号验证请按1"<< endl;cout<<" 18位身份证转换15位请按2"<< endl;cout<<" 15位身份证转化18位请按3"<< endl;cout<<" 身份证号分解显示请按4"<< endl;cout<<" 退出系统请按0"<< endl;cout<<"=================================================================="<< endl;cin>>n;switch(n){case 0:exit(0);case 1:{cout<<"请输入18位身份证"<<endl;s=0;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){cout<<a[i];}cout<<endl;for(i=1;i<=17;i++){m=a[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;if(b[y]==a[18])cout<<"身份证号码正确";else cout<<"输入的身份证号码有误";cout<<endl;break;}case 2:{cout<<"请输入18位身份证"<<endl;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){if(i!=7&&i!=8&&i!=18)cout<<a[i];}cout<<endl;break;}case 3:{cout<<"请输入15位身份证号";cout<<endl;s=0;for(i=1;i<=17;i++){if(i==7)a[i]='1';else if(i==8)a[i]='9';else cin>>a[i];}for(i=1;i<=17;i++){m=a[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;a[18]=b[y];for(i=1;i<=18;i++){cout<<a[i];}cout<<endl;break;}case 4:{cout<<"输入18位身份证号"<<endl;for(i=1;i<=18;i++){cin>>a[i];}cout<<endl;for(i=1;i<=18;i++){if(i<=6){cout<<"地址码为"<<a[i]<<endl;}else if(i<=14&&i>6){cout<<"出生日期为"<<a[i]<<endl;;}else if(i<=17&&i>14){cout<<"顺序码为"<<a[i]<<endl;;}else {cout<<"校验码位"<<a[i]<<endl;}}cout<<endl;break;}}}while(1);return 0;}//身份证号码系统//number.app#include <iostream>using namespace std;class number{public:number();//构造函数void jianyan();//检验身份证号void change1();//将18位身份证转化为15位void change2();//将15位身份证转化为18位void fenjie();//身份证号分解private:char num[20];//存储身份证号的数组};number::number()//构具体实现造函数的{int i;for(i=0;i<20;i++){num[i]='0';}}void number::jianyan()//的具体实现检验函数{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入18位身份证号码"<<endl;for(i=1;i<=18;i++)//将18位身份证存到num数组中{cin>>num[i];}for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]==num[18])cout<<"身份证号码正确";//校验身份证哈是否正确else cout<<"输入的身份证号码有误";cout<<endl;}void number::fenjie()//分解函数的具体实现{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"输入18位身份证号"<<endl;for(i=1;i<=18;i++)//将18位身证号份输入到num数组中{cin>>num[i];}for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]!=num[18])cout<<"身份证号码错误"<<endl;//校验身份证号是否正确else{cout<<"输入的身份证号码正确";cout<<endl;cout<<"地址码为";for(i=1;i<=6;i++)//输出地址码{cout<<num[i];}cout<<endl;cout<<"出生年份为";for(i=7;i<=14;i++)//输出出生年月日{cout<<num[i];}cout<<endl;cout<<"顺序码为";for(i=15;i<=17;i++)//输出顺序码{cout<<num[i];}cout<<endl;cout<<"校验码为"<<num[18];//输出校验码cout<<endl;}}void number::change1()//将18位身份证号转化为15位{int i,s,y,m;int w[20];//权值数组char b[15];//b数组位检验数组s=0;//累加求和w[1]=7;w[2]=9;w[3]=10;w[4]=5;w[5]=8;w[6]=4;w[7]=2;w[8]=1;w[9]=6;w[10]=3;//初始化ww[11]=7;w[12]=9;w[13]=10;w[14]=5;w[15]=8;w[16]=4;w[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入18位身份证"<<endl;for(i=1;i<=18;i++)//将18位身证号份输入到num数组中{cin>>num[i];}cout<<endl;for(i=1;i<=17;i++){m=num[i]-'0';//将num数组中的字符转化成数值s=s+m*w[i];//累加求出前17位身份证与其对应的的权值之和}cout<<endl;y=s%11;//算出余数if(b[y]==num[18]){cout<<"身份证号码正确";cout<<endl;for(i=1;i<=18;i++)//输出18位身份证号码中的15位{if(i!=7&&i!=8&&i!=18)cout<<num[i];}}//校验身份证哈是否正确else cout<<"输入的身份证号码有误";cout<<endl;}void number::change2()//将15位身份证号转化为18位{int i,m,y,s=0;char b[15];//权值数组bint x[20];//校验数组xx[1]=7;x[2]=9;x[3]=10;x[4]=5;x[5]=8;x[6]=4;x[7]=2;x[8]=1;x[9]=6;x[10]=3;//初始化x x[11]=7;x[12]=9;x[13]=10;x[14]=5;x[15]=8;x[16]=4;x[17]=2;b[0]='1';b[1]='0';b[2]='x';b[3]='9';b[4]='8';b[5]='7';b[6]='6';//初始化bb[7]='5';b[8]='4';b[9]='3';b[10]='2';cout<<"请输入15位身份证号";cout<<endl;for(i=1;i<=17;i++)//将输入的15位身份证号转化为17位{if(i==7)num[i]='1';else if(i==8)num[i]='9';else cin>>num[i];}for(i=1;i<=17;i++)//计算出前17位身份证号及其对应的权值之和{m=num[i]-'0';s=s+m*x[i];}cout<<endl;y=s%11;//求出余数ynum[18]=b[y];//求出第18位身份证号for(i=1;i<=18;i++)//输出18位身份证{cout<<num[i];}cout<<endl;}int fun()//主函数调用的函数,实现二级菜单{number mynumber;//建立类number的一个对象int n;//选择功能do{cout<<"******************************************************************** ***********"<< endl;cout<<"******************************身份证号码转化程序*******************************"<< endl;cout<<" 18位身份证转换15位请按1"<< endl;cout<<" 15位身份证转化18位请按2"<< endl;cout<<" 返回上一级请按0"<< endl;cout<<"************************************************************************ *******"<< endl;cin>>n;switch(n){case 0:return 0;case 1:{mynumber.change1();break;}case 2:{mynumber.change2();break;}}}while(1);return 0;}int main(){number mynumber;//建造number类的一个对象int n;//选择功能do{cout<<"******************************************************************** ************";cout<<"****************************身份证号码验证程序**********************************";cout<<"*******************************欢迎使用程序*************************************";cout<<" 身份证号验证请按1"<< endl;cout<<" 身份证互相转换请按2"<< endl;cout<<" 身份证号分解显示请按3"<< endl;cout<<" 退出系统请按0"<< endl;cout<<"************************************************************************ ********"<< endl;cin>>n;switch(n){case 0:exit(0);case 1:{mynumber.jianyan();break;}case 2:{fun();break;}case 3:{mynumber.fenjie();break;}}}while(1);return 0;}。
15位转18位excel公式
15位转18位excel公式
在Excel中,可使用以下公式将15位身份证号转换为18位:
```
=IF(LEN(A1)=15,LEFT(A1,6)&"19"&MID(A1,7,9)&MOD(SUM PRODUCT(--MID(A1,LEN(A1)-13,1)*({7; 9; 10; 5; 8; 4; 2; 1; 6; 3; 7; 9; 10; 5; 8; 4; 2})&15),11),A1)
```
将A1替换为实际包含15位身份证号的单元格引用即可。
该公式的原理是:
1. 检查输入的身份证号是否为15位,若是15位,则进行转换,反之将原值返回;
2. 将15位身份证号的前6位和后9位保留,将第7位到第15
位(包括)替换为"19";
3. 计算身份证号的最后一位校验位,根据校验位的计算方法,依次将身份证号的前17位与系数的乘积相加并取余11,再用11减去余数得到校验位。
请注意,此公式只适用于中国大陆的身份证号。
15位身份证升级为18位 并查询其信息
--15位身份证升级为18位并查询其信息create or replace procedure f_changecard(p_cert_num in varchar2)asv_cert_num varchar2(30);v_type varchar2(20);v_sum varchar2(10);--v_sum_m varchar2(10);v_yu varchar2(4);v_new varchar(30);v_nian varchar(4);v_yue varchar(4);v_ri varchar(4);v_sex varchar2(2);v_sf varchar2(10);v_sf_f varchar2(4);--v_yu_y varchar2(4);beginexecute immediate'select length(:p_cert_num) from dual'into v_typeusing p_cert_num;execute immediate'select (select substr((select :p_cert_num from dual),1,6) from dual )||19||(select substr((select :p_cert_num from dual),7,9) from dual) from dual'into v_cert_numusing p_cert_num,p_cert_num;--判断身份证是否为15位if v_type<>15then dbms_output.put_line('请输入证件号为15位的身份证信息');else--校验取余v_sum:=substr(v_cert_num,1,1)*7+substr(v_cert_num,2,1)*9+substr(v_cert_num,3,1)*10+substr(v_cert_num,4,1)*5+substr(v_cert_num,5,1)*8+substr(v_cert_num,6,1)*4+substr(v_cert_num,7,1)*2+substr(v_cert_num,8,1)*1+substr(v_cert_num,9,1)*6+substr(v_cert_num,10,1)*3+substr(v_cert_num,11,1)*7+substr(v_cert_num,12,1)*9+substr(v_cert_num,13,1)*10+substr(v_cert_num,14,1)*5+substr(v_cert_num,15,1)*8+substr(v_cert_num,16,1)*4+substr(v_cert_num,17,1)*2;--取出生年月v_nian:=substr(v_cert_num,7,4);v_yue:=substr(v_cert_num,11,2);v_ri:=substr(v_cert_num,13,2);--取性别v_sex:=substr(v_cert_num,17,1);--取地区v_sf:=substr(v_cert_num,1,6);v_sf_f:=substr(v_cert_num,1,2);--7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2v_yu:=mod(v_sum,11);--0 1 2 3 4 5 6 7 8 9 10,1 0 X 9 8 7 6 5 4 3 2 --得出新18位证件号if v_yu=0then v_new:=v_cert_num||'1';elsif v_yu=1then v_new:=v_cert_num||'0';elsif v_yu=2then v_new:=v_cert_num||'X';elsif v_yu=3then v_new:=v_cert_num||'9';elsif v_yu=4then v_new:=v_cert_num||'8';elsif v_yu=5then v_new:=v_cert_num||'7';elsif v_yu=6then v_new:=v_cert_num||'6';elsif v_yu=7then v_new:=v_cert_num||'5';elsif v_yu=8then v_new:=v_cert_num||'4';elsif v_yu=9then v_new:=v_cert_num||'3';elsif v_yu=10then v_new:=v_cert_num||'2';end if;--判断新产生的18位身份证号码真伪依据月份日期判断只能。
身份证号码转换
oldtonew = newnumber + code
end function
估计பைடு நூலகம்能看懂的不会太多,那偶就来演算一个吧。
假定旧号码为ABCDEFGHIJKLMNO
第一步,将旧号码变成ABCDEF19GHIJKLMNO
第二步,利用2的17次方到2的1次方对11进行除法运算后取得的余数,与旧号码ABCDEF19GHJIJKLMNO中的各位依次相乘并相加,得到一个num,简单来说,这个
先给大家看一下源码:
function oldtonew (oldnumber)
newnumber = left (oldnumber,6) + "19" + right (oldnumber,9)
num = 0
for i = 18 to 2 step -1
num = num + (2 ^ (i - 1) mod 11) * (mid (newnumber,19 - i,1))
num = 7*A+9*B+10*C+5*D+8*E+4*F+2*1+1*9+6*G+3*H+7*I+9*J+10*K+5*L+8*M+4*N+2*O
第三步,将num除以11得到一个余数S
第四步,如果S=0,则最后一位数字为1;
如果S=1,则最后一位数字为0;
身份证号码转换
偶然间对15位身份证号转18位身份证号的转换原理发生了兴趣,显然,前17位没有什么花样可言,而最后一位的转换,却并非是对原来的15位号码进行简单的加法或乘法运算就可以完成的。上网查了一下,发现说的都很含糊,给出的计算公式也不是那么明朗,总之,一句话,看不懂的说~~
[C#编程]身份证号码15位升18位
return perIDNew;
}
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,0101001X。
C#代码:
private string per15To18(string perIDSrc)
{
int iS = 0;
加权因子常数
int[] iW=new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
校验码常数
string LastCode=10X98765432;
新身份证号
string perIDNew;
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 211
∑(ai×Wi)(mod 11) = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai表示第i位置上的身份证号码数字值
Wi表示第i位置上的加权因子
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
15位身份证升级为18位 并查询其信息
15位身份证升级为18位并查询其信息--15位身份证升级为18位并查询其信息create or replace procedure f_changecard(p_cert_num in varchar2)asv_cert_num varchar2(30);v_type varchar2(20);v_sum varchar2(10);--v_sum_m varchar2(10);v_yu varchar2(4);v_new varchar(30);v_nian varchar(4);v_yue varchar(4);v_ri varchar(4);v_sex varchar2(2);v_sf varchar2(10);v_sf_f varchar2(4);--v_yu_y varchar2(4);beginexecute immediate'select length(:p_cert_num) from dual'into v_typeusing p_cert_num;execute immediate'select (select substr((select :p_cert_num from dual),1,6) from dual )||19||(select substr((select :p_cert_num from dual),7,9) from dual) from dual'into v_cert_numusing p_cert_num,p_cert_num;--判断身份证是否为15位if v_type<>15then dbms_output.put_line('请输入证件号为15位的身份证信息');else--校验取余v_sum:=substr(v_cert_num,1,1)*7+substr(v_cert_num,2,1)*9+substr(v_cert_num,3,1)*10+substr(v_cert_num,4,1)*5+substr(v_cert_num,5,1)*8+substr(v_cert_num,6,1)*4+substr(v_cert_num,7,1)*2+substr(v_cert_num,8,1)*1+substr(v_cert_num,9,1)*6+substr(v_cert_num,10,1)*3+substr(v_cert_num,11,1)*7+substr(v_cert_num,12,1)*9+substr(v_cert_num,13,1)*10+substr(v_cert_num,14,1)*5+substr(v_cert_num,15,1)*8+substr(v_cert_num,16,1)*4+substr(v_cert_num,17,1)*2;--取出生年月v_nian:=substr(v_cert_num,7,4);v_yue:=substr(v_cert_num,11,2);v_ri:=substr(v_cert_num,13,2);--取性别v_sex:=substr(v_cert_num,17,1);--取地区v_sf:=substr(v_cert_num,1,6);v_sf_f:=substr(v_cert_num,1,2);--7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2v_yu:=mod(v_sum,11);--0 1 2 3 4 5 6 7 8 9 10,1 0 X 9 8 7 6 5 4 3 2 --得出新18位证件号if v_yu=0then v_new:=v_cert_num||'1';elsif v_yu=1then v_new:=v_cert_num||'0';elsif v_yu=2then v_new:=v_cert_num||'X';elsif v_yu=3then v_new:=v_cert_num||'9';elsif v_yu=4then v_new:=v_cert_num||'8';elsif v_yu=5then v_new:=v_cert_num||'7';elsif v_yu=6then v_new:=v_cert_num||'6';elsif v_yu=7then v_new:=v_cert_num||'5';elsif v_yu=8then v_new:=v_cert_num||'4';elsif v_yu=9then v_new:=v_cert_num||'3';elsif v_yu=10then v_new:=v_cert_num||'2';end if;--判断新产生的18位身份证号码真伪依据月份日期判断只能。
题目身份证号码15位到18位转换
题目:身份证号码15位到18位转换一、语言和环境A 、 实现语言JavaB 、 环境要求JDK1.4以上版本及其联机帮助文档二、要求本软件是某社会保障信息管理系统的子模块,工作人员从网页上调用,可以根据参保人的15位身份证号码,计算出18位身份证号,同时显示该参保人的出生日期和性别。
程序的功能要求如下:1:设计一个有图形用户界面的Applet ,将Applet 背景色设为浅灰色,接受用户输入15位身份证号码;2:判断输入身份证号位数是否正确,判断输入是否有效(如输入非数字字符),否则提示用户重新输入;3:计算18位身份证号码;4:根据身份证号的第7-14位(YYYYMMDD )。
显示出生日期;5:根据身份证号的第17位(奇数位男性,偶数位女性),显示性别;6:生成一个用于显示Applet 的html 文件。
限制条件:只考虑20世纪(即1900-1999)出生的参保人;不考虑出生日期是否有效。
三、算法说明身份证号15位到18位转换算法:1:在6位行政区划后插入2位世纪代码(如19),构成四位出生年份,得到17位号码; 2:把17位号码从高位到低位与下列17个数字分别相乘求和(N ):「2,4,8,5,10,9,7,3,6,1,2,4,8,5,10,9,7」比如身份证号码为:1716321C C C C C ⋯⋯则74211617⨯+⋯⋯+⨯+⨯=C C C N ;3:将N 除以11取余数R ,根据余数计算尾数T ;1) 如果R =0,则T =1;如果R=1,则T=0;如果R=2,则T=X;2) 如果R=3,则T=9;如果R=4,则T=8;依此类推……;如果R=10,则T=2; 4:将尾数T 添加到17位号码后即得到18位号码。
四、推荐实现步骤1、 设计用户界面Applet 用户界面组件包括:A 、 一个用于显示标题“身份证号码15位到18位转换”的标签;B 、 四个提示标签,分别显示“15位身份证号”,“18位身份证号”,“出生日期”,“性别”;C 、 一个用于输入15位身份证号的文本框;D 、 三个显示计算结果的标签,分别显示18位身份证号、出生日期和性别;E、一个用于显示提示信息的标签;F、两个按钮,一个位“转换”,判断输入的15位身份证号是否有效,无效则给出错误信息,有效则计算18位身份证号并显示结果;另一个按钮“重新输入”,清除输入文本框和三个输出标签,提示信息标签设为“请重新输入”。
15位升18位转换公式
15位升18位转换公式
假设我们有一个15位的数字x,我们想将其转换为18位。
可以采用以下公式:
1. 创建一个空的18位字符串,命名为result。
2. 用递归的方式遍历x的每一位数字:
- 如果遍历到的数字是0,将result追加字符"A"。
- 如果遍历到的数字是1,将result追加字符"B"。
- 如果遍历到的数字是2,将result追加字符"C"。
- 依此类推,使用不同的字符映射每个数字。
3. 返回result作为转换后的18位数字。
需要注意的是,由于题目要求不能出现真实名字和引用,我们使用了简单的字符映射来实现转换。
实际上,可能还有其他的转换方式,但这个公式提供了一种可行的方法。
在VFP6.0中实现身份证号码的升位
在VFP 6.0中实现身份证号码的升位Upgrading Citizen Identif ication Number in VFP 6.0何健雄黎银环(新会市劳动和社会保障局新会529100)(江门教育学院江门529000)摘要 介绍了基于Visual Foxpro 6.0环境下开发的管理信息系统 给出了一种公民身份证号码由15位到18位的转换算法 并介绍了从身份证号码中获取相关个人信息的方法G关键词 身份证号码 升位 校验码 管理信息系统ABSTRACTThis paper introduces a demonstration of MIS which is developed in Visual Foxpro 6.0environment and presents analgorithm of upgrading citizen identification number from 15bits to 18bits .And also how to get personal information from citizen i-dentification number is introduced .KEYWORDScitizen identification number upgrading check code MIS118位公民身份证号码的含义根据GB 11643-1999中有关公民身份号码的规定 公民身份号码是特征组合码 由17位数字本体码和1位数字校验码组成18位编码G 排列顺序从左至右依次为:6位数字地址码 8位数字出生日期码 3位数字顺序码和1位数字校验码G 地址码表示编码对象常住户口所在地的行政区划代码S 出生日期码表示编码对象出生的年~月~日 其中年份用4位 月~日分别用两位数字表示S 顺序码表示同一地址码所标识的区域范围内 对同年~月~日出生的人员编定的顺序号 顺序码的奇数分给男性 偶数分给女性G 第18位的校验码用于检测身份证号码的正确性 由号码编制单位按统一的公式计算出来 包括0-9和X 共11个数字 其中X 是罗马数字中的10G 使用中 用英文字母X 表示罗马数字X G 以上的编码规则可以保证公民的身份证符合国家标准G2实现身份证15位升18位的算法前17位数字本体码的升位处理较简单G 因为本MIS 系统处理的身份证的持有人都为成年人 肯定是在2000年以前出生的 所以只要在原地区号和出生日期间加入了*19 两位数字表示年份即可G 再根据前17位数字码 算出顺序值 按照IS 07064:1983 M 0D 11-2校验码系统计算出最后一位的检验码G下面举例说明该计算方法G 2.1算法示例首先利用17位数按照公式(1)计算加权因子:W z =Mod (2 z 11)(1)公式(1)中:z 表示号码字符从右第1位开始 向左递增的位置序号 取1{z {17W z 表示第z 位置上的加权因子SMod (n D ividend n D ivisor )表示为取模运算 返回值类型数值型S参数n D ividend 表示指定被除数G n D ivisor 表示指定除数G按照公式(2)计算校验码的顺序值:Mod (E (A z X W z ) 11)(2)公式(2)中:A z 表示本体码中出生年份由2位调整为4位后第z 位置上的号码字符值G表1本体码为440721*********例子的计算结果z 1716151413121110987654321A z 44072119750928061W z7910584216379105842根据公式(2)进行计算:Mod (E A z X W z ) 11=Mod (354 11)=2根据IS 07064:1983 M 0D 11-2计算:表1中的W z 值7 9 10 5 8 4 2 1 6 3是10个循环的权值 对前17个数字的W z 每一个数字加权和对11取模后 得到一个反相错位表 从校验码系统表中查出相应的校验码 如表2所示G表2校验码系统表Mod (E (A z X W z ) 11)的结果顺序值012345678910校验码字符值对应值10X 98765432e 2003-02-11收到 2003-06-01改回e e何健雄 男 1975年生 重庆大学在读硕士 研究方向:计算机应用技术 数据库应用G~41~(总416)在VF P 6.0中实现身份证号码的升位2003年查出结果顺序值为2时对应的校验码为X*所以该人员的公民身份号码应该为440721************ G2.2身份证号码15位升18位的编程代码实现FUNCTION ID15T018函数值:成功返回18位*不成功返回空串GPARAMETERS M.ID15PRIVATE ALLM.ID15=ALLT(M.ID15)IF LEN(M.ID15)=1588输入参数为15位M.ID17=STUFF(M.ID15*7*0*19)ELSEIF LEN(M.ID15)=1888输入参数为18位M.ID17=LEFT(M.ID15*17)ELSERETURNENDIFENDIF求加权因子Wi:DIMENSION A WI[17]FOR I=1TO17A WI[I]=MOD(2^I*11)ENDFOR求第18位:M.N=0FOR I=1TO17M.N=M.N+VAL(SUBSTR(M.ID17*17-I+1*1))A WI[I]ENDFORRETURN M.ID17+SUBSTR(10X98765432*MOD(M.N* 11)+1*1)升位结果会出现以下两种情况:D最后返回正确的18位的身份证号码G@返回的是空串字符*说明没有成功升位G其原因主要有:a.身份证为假造身份证*原15位编码不符合GB11643-1989标准G b.录入时人为录入错误*或录入的15位的身份证号码含有非数字字符G3实现身份证18位转15位的算法在实际操作中*当要把身份证号码由18位转15位时*只要是去掉18位身份证号码中左起的第7~8和第18位*即去掉19'年份和最后的校验码即可G4从身份证号码中获取相关个人信息在处理个人信息时*通常还要记录其出生年月~性别~户口所在地等信息G为避免人工重复录入*可从已录入的身份证号码中取得所需信息G以下给出的算法对15位和18位的身份证同样适用G 4.1从身份证号码中取得出生年月日~性别FUNCTION IDTOBIRTH功能:成功返回18位*不成功返回空串G参数:M.ID=15或18位身份证号PARAMETERS M.IDM.ID=ALLT(M.ID)PRIVATE ALLIF LEN(M.ID)=0RETURNENDIFIF LEN(M.ID)=1588输入参数为15位*先变为17位M.ID=STUFF(M.ID*7*0*19)ENDIFM.CYEAR=SUBSTR(M.ID*7*4)M.CMONTH=SUBSTR(M.ID*11*2)M.CDAY=SUBSTR(M.ID*13*2)M.NSEX=VAL(SUBSTR(M.ID*17*1)IF M.NSEX/2i INT(M.NSEX/2)M.CSEX=男ELSEM.CSEX=女ENDIFIF(VAL(M.CMONTH)<1OR VAL(M.CMONTH)>13) OR(VAL(M.CMONTH)<1OR VAL(M.CMONTH)>31)OR1(LEN(M.ID)=17 OR LEN(M.ID)=18)MESSAGEBOX(身份证号码有错1*16*)RETURNENDIFRETURN M.CYEAR+年+M.CMONTH+月+M. CDAY+日+M.CSEX返回结果会出现以下两种情况:D能成功返回*如1999年12月31日男格式的字符串G@返回空字符串*表示失败*其主要原因是原号码不正确G4.2取得户口所在地要从身份证号码中取得该公民的户口所在地*只要把身份证号码的前6位与全国县及县以上行政区划代码表(GB T2260-1999)中的记录进行匹配*就可确定其具体代表的地区G上述算法已经成功地在新会市劳动和社会保障局的管理信息系统中使用*该系统中的记录有20多万条*经过以上程序测试*返回记录中有103条为空字符串*估计部分身份证号码为伪造号码或人为录入错误G 本文以Visual Foxpro6.0软件为主要开发平台*结合自身MIS系统的特点*设计了一种有效的身份证升位算法*并从现有的身份证号码信息中获取得个人(下转第21页)y = I 1z=1w zj2I z1;记6=[91,92,93,.....9n ]为网络中所有待求的权值和阈值O选择RPE 算法修正参数6,直到收敛O RPE 算法的计算公式为,<r)=y<r)-y 1<r)P<r)=1/<r){P<r-1)-P<r-1)P<r)[/<r)+PT<r)P<r-1)P<r)]-1PT<r)P<r-1)(L 6<r)=6<r-1)+P<r)P<r) <r)其中/<r )为遗忘因子,在迭代初期/<r )<1,而当r >O 时,/->1,满足下列关系,/<r )=/0/<r -1)+<1-/0)其中的/0以及/的初始值可根据需要设置O 在本系统中我们将它设置为1OP 矩阵的元素分别为,l =Ik 1当9z =wk 2,1<=k<=n 1;Ik 1<1-Ik 1)wk 2,9z =bk 1,1<=k<=n 1Ik 1<1-Ik 1)wk 2Im ,9z =wk m1,1<=k<=n 1,1<=m<=n (L根据上述方法,利用V 设计的前馈神经网络系统的算法实现步骤为,D 从样本集中取出一对输入-输出样本;@对样本进行适当变换;计算隐层节点和输出节点的值I j 和y 1;G 构造P 矩阵@计算/<r );计算预报误差,P 矩阵以及参数向量6;重复步骤D~ ,直到均方差满足条件,打印结果O2应用实例将上述神经网络用于一个温度测量系统O 选择<铜 康铜)热电偶温度传感器静态输入输出特性作为神经网络的输入和输出,将热电偶测到的电动势按照顺序分别加到网络的输入端,而将对应的温度作为网络的期望输出,用于网络学习O 经过训练,确定权值,这一组权值记录了热电偶的输入输出特性曲线O 仿真试验表明,如果直接以测到的电动势作为神经网络的输入,收敛的速度很慢,产生~假极点 O 因此,对样本首先进行了变换,将输入范围变换在[-1,1]O 权值矩阵中,各个权值可以由用户直接输入,也可以随机选择O 本试验的权值初始值在[-10,10]范围内随机得到O 计算结果表明,当P =105,均方差可以达到0.2%,较好地反映了系统的输入与输出之间的映射关系O表1CC <铜-康铜)热电偶静态特性电动势<mV )测定温度<C )神经网络输出-5.18-100-103.3000.26.3210099.213.42200202.121.04300298.628.95400404.737.01500502.0345.10600598.253.14700699.261.08800798.168.85900898.8本文中的算法采用了高斯-牛顿搜索方法,因而具有极快的收敛速度[1]O 该算法易于编程,通过设置不同的初值,可以方便地用于建立其他的非线性系统模型O 样本值的选择对于算法的收敛性具有较大的影响O 为避免这种情况需要先对样本进行预处理O 在本试验中,当直接输入样本值本身时,算法发散,而在对样本进行预处理之后,算法快速收敛O 表1的实验结果均在40000次迭代的范围内得到O参考文献1L 雍,T 索德斯图姆著.田立生,褚家晋,善铁军译.递推辨识的理论与实践.北京,科学出版社,1989,418~4232李士勇编著.模糊控制神经控制和智能控制论.哈尔滨,哈尔滨工业大学出版社,1998,99~1013黄贤武,郑筱霞编著.传感器原理与应用.成都,电子科技大学出版社,1999,316~3274曹建荣.人工神经网络在传感器非线性校正上的应用.自动化仪表,2001,22<8),19<上接第15页)资料的常用信息,避免了人工的重复录入,达到提高工作效率的目的,也防止了数据的冗余和操作中潜在的不一致问题O 虽然现在市场和互连网上有许多现成的实用软件垂手可得,但大多只强调通用性而缺乏针对性,可移植性较差,很难直接嵌入到实用的MIS 系统中O 因此,在建设和健全MIS 系统时,仍有必要花大力气去设计一些适合自身MIS 系统使用的算法,编写实用的过程和函数O 我们已向广东省劳动和社会保障厅推广了我们的算法,并在<广东省劳动力市场管理系统>中得到应用O参考文献1Microsoft .Visual Studio Msdn Library .Jaly 2000,全书2公民身份号码在社会保障系统中的应用<中华人民共和国劳动和社会保障部).h tt p ,//WWW .molss .g o V .cn /t he m e /xxhj s /dy Z 1200213.h tm。
15位升18位转换公式
15位升18位转换公式
升位和转换位是数字进制中常见的操作,下面是从15位转换为18位的示例:
假设我们要将一个15位的数字转换为18位,可以在数字的前面补0,直到达到18位。
补0的个数为18位减去15位,即3位。
举例:
将数字123456789012345转换为18位,可以在数字前面补3个0,即000123456789012345。
这样就完成了从15位转换为18位的操作,将原数字的位数扩展到18位,其中前面补0的个数取决于需要转换的位数差值。
请注意,在实际的计算或编程中,具体的转换公式可能会根据编程语言或操作方法有所不同。
上述示例提供了一种常见的方式来进行位数转换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据公式(1)进行计算:
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 2/11
∑(ai×Wi)(mod 11) = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
exit;
end;
S:= S mod 11;
Result:= NewID + A[S];
end;
end;
正确与否请大家指正!
再次谢谢。
function TForm1.f(ID: string):string;
const
W:array [1..18] of integer = (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
A:array [0..10] of char = ('1','0','x','9','8','7','6','5','4','3','2');
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
以下是我的delphi 函数
S:= 0;
try
for i:=1 to 17 do begin
j:= StrToInt(NewID[i]) * W[i];
S:= S + j;
end;
except
result:= '';
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符ቤተ መጻሕፍቲ ባይዱ;
Wi----示第i位置上的加权因子,其数值依据公司Wi=2(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
var
i, j, S: integer;
NewID: string;
begin
if Length(ID) <> 15 then
result:= ''
else begin
NewID:= ID;
Insert('19', NewID, 7);
用Delphi实现身份证15位升18位的算法
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。