身份证号码15位到18位的转换

来源:互联网 发布:山东师范大学网络平台 编辑:程序博客网 时间:2024/06/05 10:41

  完整文章和代码下载: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. 判断输入是否输入身份证
程序代码:
  1. if(strCardID == "") {
  2.     lblShowMessage.Text = "您没有输入身份证号码,请正确输入";
  3.     return;
【转换事件处理】
2. 判断输入的身份证长度是否等于15位
程序代码:
  1. if(strCardID.Length != 15) {
  2.     lblShowMessage.Text = "您输入的身份证号码的位数为" + txtCardID.Text.Length + ",请重新输入";
  3.     return;
  4. }

【转换事件处理】
3. 判断输入的15位身份证的每一都是整型
   可以将15位字符串转换为长整型数据,如果不出现异常则每一位都是整型,否则就包含非整型字符

程序代码:
  1. try {
  2.     iCardID = long.Parse(strCardID);
  3. catch {
  4.     lblShowMessage.Text = "您输入的身份证号码包含非数字,请重新输入";
  5. }

【转换事件处理】
4. 将15位身份证字符串保存到15位字符数组oldCardID中
   定义一个18为的字符数组newCardID用于保存新身份证号码
   将oldCardID的第0位到第5位保存到newCardID的第第0位到第5位中
   为newCardID的第6位和第7位分别赋值为'1'和'9'
   将oldCardID的第6为到第14为保存到newCardID的第8位到第16位中

程序代码:
  1. char[] oldCardID = strCardID.ToCharArray();
  2. char[] newCardID = new char[18];
  3. for(int i = 0; i < 6; i++) {
  4.     newCardID[i] = oldCardID[i];
  5. }
  6. newCardID[6] = '1';
  7. newCardID[7] = '9';
  8. for(int i = 6; i < oldCardID.Length; i++) {
  9.     newCardID[i + 2] = oldCardID[i];
  10. }

【转换事件处理】
5. 定义一个整型数组quan用于保存权值
   定义一个整型变量N用于求新身份证的第0位到第16位和权值乘积的和
   根据N对11取模得到的值得到新身份证的第17位

程序代码:
  1. int N = 0;
  2. int[] quan = new int[] { 2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7 };
  3. for(int i = 0; i < quan.Length; i++) {
  4.     N = N + quan[i] * (newCardID[quan.Length - i - 1] - 48);
  5. }
  6. N %= 11;
  7. switch(N) {
  8.     case 0:
  9.         newCardID[17] = '1';
  10.         break;
  11.     case 1:
  12.         newCardID[17] = '0';
  13.         break;
  14.     case 2:
  15.         newCardID[17] = 'X';
  16.         break;
  17.     case 3:
  18.         newCardID[17] = '9';
  19.         break;
  20.     case 4:
  21.         newCardID[17] = '8';
  22.         break;
  23.     case 5:
  24.         newCardID[17] = '7';
  25.         break;
  26.     case 6:
  27.         newCardID[17] = '6';
  28.         break;
  29.     case 7:
  30.         newCardID[17] = '5';
  31.         break;
  32.     case 8:
  33.         newCardID[17] = '4';
  34.         break;
  35.     case 9:
  36.         newCardID[17] = '3';
  37.         break;
  38.     case 10:
  39.         newCardID[17] = '2';
  40.     break;
  41. }

【转换事件处理】
6. 将新身份证的字符数组中的内容显示

程序代码:
  1. foreach(char ch in newCardID) {
  2.     lblCardIDNew.Text += ch;
  3. }

【转换事件处理】
7. 显示生日日期
   在新身份证数组中的6位到第9为是出生年;第10和11位为出生月;第12和13位为出生日

程序代码:
  1. for(int i = 6; i < 10; i++) {
  2.     lblShowBirthday.Text += newCardID[i];
  3. }
  4. lblShowBirthday.Text += "年";
  5. for(int i = 10; i < 12; i++) {
  6.     lblShowBirthday.Text += newCardID[i];
  7. }
  8. lblShowBirthday.Text += "月";
  9. for(int i = 12; i < 14; i++) {
  10.     lblShowBirthday.Text += newCardID[i];
  11. }
  12. lblShowBirthday.Text += "日";

【转换事件处理】
8. 显示性别
   新身份证数组的第16位为奇数表示性别为“男”,为偶数表示性别为“女”

程序代码:
  1. if((newCardID[16] % 2) == 0)
  2.     lblShowSex.Text = "女";
  3. else
  4.     lblShowSex.Text = "男";

【实现重输按钮事件】
重置清除文本框中的内容、标签等内容

程序代码:
  1. txtCardID.Text = "";
  2. lblCardIDNew.Text = "";
  3. lblShowBirthday.Text = "";
  4. lblShowSex.Text = "";
  5. lblShowMessage.Text = "请重新输入";

 

原创粉丝点击