使用C#实现身份证号码15位到18位的转换
2010-03-17 09:22
1376 查看
完整文章和代码下载:http://www.dingos.cn/index.php?topic=958.0
程序初始界面:
输入15为身份证号码,点击“转换”按钮后,进行验证:
没有输入身份证号码:
输入的不是15位:
身份证号码中包含非数字:
正确的身份证转换为18位身份证,并显示出生日期和性别:
点击“重新输入”去空文本框等
转换算法:
在6位行政区划后插入2为世纪代码(如19),构成四位出生年份,得到17位号码;
把17位号码从高位到底位与下拉17个数字分别相乘求和(N):
[2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7]
比如身份证号码为:C1C2C3...C17,则N = C17 × 2 + C16 × 4 + ... + C1 × 7
将N除以11取余数R,根据余数计算尾数T:
如果R = 0,则T = 1;如果R = 1,则T = 0;如果R = 2,则T = X;
如果R = 3,则T = 9;如果R = 4,则T = 8;依此类推……;如果R = 10,则T = 2;
将尾数T添加到17为号码后既得到18为号码。
根据身份证号的第7-14位(YYYYMMDD),显示出生日期;
根据身份证号的第17位(奇数为男性,偶数为女性),显示性别;
【分析】
★ 定义字符串strCardID用于接收文本框输入的信息;
★ 定义一个字符数组oldCardID用于保存15位的原始身份证;
★ 并定义一个字符数组newCardID用于保存转换后的18位的身份证;
★ 将oldCardID的第0位到5位之间保存到newCardID的第0位到5位;
★ newCardID第6位和第7为分别是“1”和“9”;
★ 将oldCardID第6到14保存到newCardID的第8位到第16位;
★ 根据公式“N = C17 × 2 + C16 × 4 + ... + C1 × 7”求出newCardID的第17为;
★ 将字符数组newCardID转换成字符串,并显示;
★ 同时将生日、性别显示
【转换事件处理】
1. 判断输入是否输入身份证
2. 判断输入的身份证长度是否等于15位
3. 判断输入的15位身份证的每一都是整型
可以将15位字符串转换为长整型数据,如果不出现异常则每一位都是整型,否则就包含非整型字符
4. 将15位身份证字符串保存到15位字符数组oldCardID中
定义一个18为的字符数组newCardID用于保存新身份证号码
将oldCardID的第0位到第5位保存到newCardID的第第0位到第5位中
为newCardID的第6位和第7位分别赋值为'1'和'9'
将oldCardID的第6为到第14为保存到newCardID的第8位到第16位中
5. 定义一个整型数组quan用于保存权值
定义一个整型变量N用于求新身份证的第0位到第16位和权值乘积的和
根据N对11取模得到的值得到新身份证的第17位
6. 将新身份证的字符数组中的内容显示
7. 显示生日日期
在新身份证数组中的6位到第9为是出生年;第10和11位为出生月;第12和13位为出生日
8. 显示性别
新身份证数组的第16位为奇数表示性别为“男”,为偶数表示性别为“女”
【实现重输按钮事件】
重置清除文本框中的内容、标签等内容
程序初始界面:
输入15为身份证号码,点击“转换”按钮后,进行验证:
没有输入身份证号码:
输入的不是15位:
身份证号码中包含非数字:
正确的身份证转换为18位身份证,并显示出生日期和性别:
点击“重新输入”去空文本框等
转换算法:
在6位行政区划后插入2为世纪代码(如19),构成四位出生年份,得到17位号码;
把17位号码从高位到底位与下拉17个数字分别相乘求和(N):
[2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7]
比如身份证号码为:C1C2C3...C17,则N = C17 × 2 + C16 × 4 + ... + C1 × 7
将N除以11取余数R,根据余数计算尾数T:
如果R = 0,则T = 1;如果R = 1,则T = 0;如果R = 2,则T = X;
如果R = 3,则T = 9;如果R = 4,则T = 8;依此类推……;如果R = 10,则T = 2;
将尾数T添加到17为号码后既得到18为号码。
根据身份证号的第7-14位(YYYYMMDD),显示出生日期;
根据身份证号的第17位(奇数为男性,偶数为女性),显示性别;
【分析】
★ 定义字符串strCardID用于接收文本框输入的信息;
★ 定义一个字符数组oldCardID用于保存15位的原始身份证;
★ 并定义一个字符数组newCardID用于保存转换后的18位的身份证;
★ 将oldCardID的第0位到5位之间保存到newCardID的第0位到5位;
★ newCardID第6位和第7为分别是“1”和“9”;
★ 将oldCardID第6到14保存到newCardID的第8位到第16位;
★ 根据公式“N = C17 × 2 + C16 × 4 + ... + C1 × 7”求出newCardID的第17为;
★ 将字符数组newCardID转换成字符串,并显示;
★ 同时将生日、性别显示
【转换事件处理】
1. 判断输入是否输入身份证
if(strCardID == "") { lblShowMessage.Text = "您没有输入身份证号码,请正确输入"; return; }
2. 判断输入的身份证长度是否等于15位
if(strCardID.Length != 15) { lblShowMessage.Text = "您输入的身份证号码的位数为" + txtCardID.Text.Length + ",请重新输入"; return; }
3. 判断输入的15位身份证的每一都是整型
可以将15位字符串转换为长整型数据,如果不出现异常则每一位都是整型,否则就包含非整型字符
try { iCardID = long.Parse(strCardID); } catch { lblShowMessage.Text = "您输入的身份证号码包含非数字,请重新输入"; }
4. 将15位身份证字符串保存到15位字符数组oldCardID中
定义一个18为的字符数组newCardID用于保存新身份证号码
将oldCardID的第0位到第5位保存到newCardID的第第0位到第5位中
为newCardID的第6位和第7位分别赋值为'1'和'9'
将oldCardID的第6为到第14为保存到newCardID的第8位到第16位中
char[] oldCardID = strCardID.ToCharArray(); char[] newCardID = new char[18]; for(int i = 0; i < 6; i++) { newCardID[i] = oldCardID[i]; } newCardID[6] = '1'; newCardID[7] = '9'; for(int i = 6; i < oldCardID.Length; i++) { newCardID[i + 2] = oldCardID[i]; }
5. 定义一个整型数组quan用于保存权值
定义一个整型变量N用于求新身份证的第0位到第16位和权值乘积的和
根据N对11取模得到的值得到新身份证的第17位
int N = 0; int[] quan = new int[] { 2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7 }; for(int i = 0; i < quan.Length; i++) { N = N + quan[i] * (newCardID[quan.Length - i - 1] - 48); } N %= 11; switch(N) { case 0: newCardID[17] = '1'; break; case 1: newCardID[17] = '0'; break; case 2: newCardID[17] = 'X'; break; case 3: newCardID[17] = '9'; break; case 4: newCardID[17] = '8'; break; case 5: newCardID[17] = '7'; break; case 6: newCardID[17] = '6'; break; case 7: newCardID[17] = '5'; break; case 8: newCardID[17] = '4'; break; case 9: newCardID[17] = '3'; break; case 10: newCardID[17] = '2'; break; }
6. 将新身份证的字符数组中的内容显示
foreach(char ch in newCardID) { lblCardIDNew.Text += ch; }
7. 显示生日日期
在新身份证数组中的6位到第9为是出生年;第10和11位为出生月;第12和13位为出生日
for(int i = 6; i < 10; i++) { lblShowBirthday.Text += newCardID[i]; } lblShowBirthday.Text += "年"; for(int i = 10; i < 12; i++) { lblShowBirthday.Text += newCardID[i]; } lblShowBirthday.Text += "月"; for(int i = 12; i < 14; i++) { lblShowBirthday.Text += newCardID[i]; } lblShowBirthday.Text += "日";
8. 显示性别
新身份证数组的第16位为奇数表示性别为“男”,为偶数表示性别为“女”
if((newCardID[16] % 2) == 0) lblShowSex.Text = "女"; else lblShowSex.Text = "男";
【实现重输按钮事件】
重置清除文本框中的内容、标签等内容
txtCardID.Text = ""; lblCardIDNew.Text = ""; lblShowBirthday.Text = ""; lblShowSex.Text = ""; lblShowMessage.Text = "请重新输入";
相关文章推荐
- C# 15位身份证号码转18位算法实现
- 身份证号码15位转18位 C#实现
- java 实现从15位~18位的身份证号码转换,校验中国大陆公民身份证、香港居民身份证、澳门身份证和台湾身份证。
- 身份证号码15位到18位的转换
- 身份证格式验证(含15位转换到18位)C#
- 身份证号码15位升18位(C#)
- 15位身份证号码转换成18位身份证号码(java代码)
- 验证身份证号码格式 C# 支持18位 15位新旧版身份证
- java代码实现15位身份证号码升级到18位
- 身份证号码15位升18位(C#)
- Javascript实现身份证号码15位转18位的算法
- Java身份证号码验证及将15位转换18位
- C#实现的18位身份证号码最新算法[验证部分]
- 新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位
- JS实现身份证号码15位转18位时最后一位的算法
- 身份证号码15位升18位(C#)
- Excel实现身份证号码自动转换为18位的技巧
- Excel中如何将15位身份证号转换为18位
- Javascript js 身份证号码 检测 规则 18位 15位
- 如何使用C#实现QQ号码的申请