1. 程式人生 > >身份證號碼15位到18位的轉換

身份證號碼15位到18位的轉換

  • 程式初始介面:
  • 輸入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 = newchar[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 = newint[] { 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 = "請重新輸入";