技巧區‎ > ‎高級程度‎ > ‎

核對香港身份證 [2002年2月]

張貼者:2010年5月29日 上午6:36Carson Cheng   [ Carson Cheng 已於 2011年1月19日 下午11:57 更新 ]
在這個數碼年代,我們日常生活中都要面對許許多多的數字,身份證號碼是其一。
  香港身份證號碼後端,有一雙括號,括號內有一個數字(或「A」字),叫「校檢碼(Check Digit)」,許多人都只知其名,而不知其義,這次就讓我介紹一下。
  在輸入資料時,如果由人手輸入,錯誤的機會當然大,就算利用條碼 (Barcode) 也難保輸入無誤,所以校檢碼就應運而生。透過一條公式,我們把一組數字轉化成一個校檢碼,如果這組數字內有任何一個數字改變了,公式就會產生一個不一樣的校檢碼(如果這條公式會產生一個跟原來一樣的校檢碼,這條公式就不可以接受)。
  當你輸入了一個身份證號碼(包括校檢碼),電腦可以馬上運用公式把括號前端的字母和數字算出一個校檢碼,如果這個校檢碼跟括號內的校檢碼一樣,那就代表正確的機會很大;相反,如果不一致的話,就可以肯定輸入的號碼是錯誤的。
  校檢碼的公式不很複雜,用一個例子說明就很容易理解:


  而當前方有一個X時,則在累積數加上6:


註:

  • 第二個英文字母的代表數字:A為1,B為2,C為3,如此類推。
  • 英文字母可以是兩個位,絕大部分人的身份證都只有一個位。
  • 校檢碼如果是10,用「A」代表;是11的話,用「0」代表。


示範


程式碼如下:
' HKID 決定輸入裡的香港身份證編號是否正確
' 輸入:sInput: "AA999999(9)" 或 "A999999(9)"
' 輸出:香港身份證編號是否正確
Function HKID(sInput As String) As Boolean
 Dim iAcc As Integer    ' 累加變數
 Dim sCheck As String
 Dim i As Integer

 ' 如果sInput只有10位(包括括號),則在前面多加一個空位
 If Len(sInput) = 10 Then sInput = " " & sInput
 
 ' 如果sInput的文字長度是11,且第一個字母不是X就是空格,且文字中第9和11位的是括號,
 ' 則繼續運算,否則已經可確定sInput是錯誤的。
 If Len(sInput) = 11 And (Left(sInput, 1) = " " Or Left(sInput, 1) = "X") And _
       Mid(sInput, 9, 1) = "(" And Right(sInput, 1) = ")" Then
   
   ' 起始化
   sInput = UCase(sInput)         ' 把英文都轉成大草
   sCheck = Mid(sInput, 10, 1)   ' 校檢碼
   iAcc = 0                              ' 累加變數
   
   ' 英文部分(第1、2位)
   ' 第一個字母:如果是X的話,則加上6
   If Left(sInput, 1) = "X" Then iAcc = iAcc + 6
   ' 第二個字母:A 代表 1; B 代表 2 如此類推,然後乘上8
   iAcc = iAcc + (Asc(Mid(sInput, 2, 1)) - 64) * 8
   
   ' 數字部分(第3到8位)
   ' 第一個數字(由左至右)乘上7,第二個數字乘上6,如此類推
   For i = 3 To 8
     iAcc = iAcc + Val(Mid(sInput, i, 1)) * (10 - i)
   Next i
   
   ' 校檢碼等於11減去累積數除以11的餘數,會得出一個1至11的數字
   iAcc = 11 - iAcc Mod 11
   
   ' 看看這裡算出的校檢碼與輸入的是否一致
   ' 如果算出的校檢碼是10的話,則用"A"代表;是11的話,則用0代表。
   Select Case iAcc
       Case 10
           HKID = (sCheck = "A")
       Case 11
           HKID = (sCheck = "0")
       Case Else
           HKID = (sCheck = Trim(Str(iAcc Mod 10)))
   End Select
 Else
   HKID = False
 End If
End Function


我現在還沒有弄清楚第一個英文字母的計算方法,主要是不知道是否只可以是「X」,如有錯誤,請不吝指正!在此特別謝謝Frankie Wong!
ċ
3_5.zip
(13k)
Carson Cheng,
2010年5月29日 上午6:37
Comments