身份證號碼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
★ 將字元陣列newCardID轉換成字串,並顯示;
★ 同時將生日、性別顯示 【轉換事件處理】
1. 判斷輸入是否輸入身份證
程式程式碼:
- if(strCardID == "") {
- lblShowMessage.Text = "您沒有輸入身份證號碼,請正確輸入";
- return;
- }
2. 判斷輸入的身份證長度是否等於15位
程式程式碼:
- if(strCardID.Length != 15) {
- lblShowMessage.Text = "您輸入的身份證號碼的位數為"
- 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 = newchar[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 = newint[] { 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 = "請重新輸入";