swf.com.tw

2007/04/04

使用JavaScript驗證身份證號碼及其原理

作者: cubie 於 「 教學文件, 動態網頁製作

使用JavaScript驗證身份證號碼及其原理
文∕趙英傑

電子商務或者一般的會員註冊網站,經常需要使用身份證號碼驗證程式。身份證號碼有一定的組成規則,以台灣地區為例,首碼一定是英文字母,後面跟著代表性別的數字1或2,然後再銜接8個數字。A123456789是一個合格的身份證號碼,驗證原理如下圖所示:

驗證身份證號碼

底下是驗證此號碼是否合格的計算公式:

驗證身份證號碼

根據上圖的說明,我們可以用JavaScript的正規表達式(Regular Expression),加上簡易的字串與數學運算式,寫出如下的驗證函數:

function checkID(idStr){
  // 依照字母的編號排列,存入陣列備用。
  var letters = new Array('A', 'B', 'C', 'D',
      'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
      'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
      'X', 'Y', 'W', 'Z', 'I', 'O');
  // 儲存各個乘數
  var multiply = new Array(1, 9, 8, 7, 6, 5,
                           4, 3, 2, 1);
  var nums = new Array(2);
  var firstChar;
  var firstNum;
  var lastNum;
  var total = 0;
  // 撰寫「正規表達式」。第一個字為英文字母,
  // 第二個字為1或2,後面跟著8個數字,不分大小寫。
  var regExpID=/^[a-z](1|2)\d{8}$/i;
  // 使用「正規表達式」檢驗格式
  if (idStr.search(regExpID)==-1) {
    // 基本格式錯誤
	alert(\"請仔細填寫身份證號碼\");
   return false;
  } else {
	// 取出第一個字元和最後一個數字。
	firstChar = idStr.charAt(0).toUpperCase();
	lastNum = idStr.charAt(9);
  }
  // 找出第一個字母對應的數字,並轉換成兩位數數字。
  for (var i=0; i<26; i++) {
	if (firstChar == letters[i]) {
	  firstNum = i + 10;
	  nums[0] = Math.floor(firstNum / 10);
	  nums[1] = firstNum - (nums[0] * 10);
	  break;
	}
  }
  // 執行加總計算
  for(var i=0; i<multiply.length; i++){
    if (i<2) {
      total += nums[i] * multiply[i];
    } else {
      total += parseInt(idStr.charAt(i-1)) *
               multiply[i];
    }
  }
  // 和最後一個數字比對
  if ((10 - (total % 10))!= lastNum) {
	alert(\"身份證號碼寫錯了!\");
	return false;
  }
  return true;
}

' 使用JavaScript驗證身份證號碼及其原理 ' 有 3 則迴響

使用 RSS 訂閱迴響,或者 TrackBack 至 ' 使用JavaScript驗證身份證號碼及其原理 '。

  1. Gary 說:

    最後的檢查程式如果身份證尾碼為0的時候會有錯誤.
    小弟把他增加了幾行.
    //規則一餘數為零,且檢查碼需為零
    if (lastNum == 0 && (total % 10) != 0 ){
    alert(\”身份證號碼寫錯了!\”);
    return false;
    }
    //規則二餘數與檢查碼需相符
    if ((10 - (total % 10))!= lastNum) {
    alert(\”身份證號碼寫錯了!\”);
    return false;
    }

    2007/10/18 @ 1:48 pm

  2. cubie 說:

    非常感謝 :mrgreen:

    2007/10/18 @ 5:07 pm

  3. Gary 說:

    不好意思.我原來那段好像還是有點瑕疵.
    這樣比較好點.

    //規則一餘數為零,且檢查碼需為零
    if (lastNum == 0 && (total % 10) != lastNum ){
    alert(\”身份證號碼寫錯了!\”);
    return false;
    }
    //規則二餘數與檢查碼需相符
    if (lastNum != 0 && (10 - (total % 10))!= lastNum) {
    alert(\”身份證號碼寫錯了!\”);
    return false;
    }

    2007/10/22 @ 11:59 am

撰寫迴響

:mrgreen: :neutral: :twisted: :shock: :smile: :???: :cool: :evil: :grin: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: