摘要:身份證驗證
身分證號碼的驗證規則
一般而言大家對身份字號的認知,多是知道共有10位,位第一位為英文字母,知道再多一點的大概就是第二個數字是男女生之分,男生為 1,女生為 2,接下來的一陀數字,是不是隨便輸入都可以呢?其實是不可以的。
身份證字號後面八個數字不是隨便打一些數字就可以了,其實前面七個可以隨便打,但是最後一位為檢查碼,必須經過之前一個字母與8個數字的組合計算後得出,以下即為檢查碼的運算原則:
- 英文代號以下表轉換成數字 : A=10 台北市 J=18 新竹縣 S=26 高雄縣 B=11 台中市 K=19 苗栗縣 T=27 屏東縣 C=12 基隆市 L=20 台中縣 U=28 花蓮縣 D=13 台南市 M=21 南投縣 V=29 台東縣 E=14 高雄市 N=22 彰化縣 * W=32 金門縣 F=15 台北縣 * O=35 新竹市 X=30 澎湖縣 G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山 H=17 桃園縣 Q=24 嘉義縣 * Z=33 連江縣 * I=34 嘉義市 R=25 台南縣。
- 英文轉成的數字, 個位數乘9再加上十位數。
- 各數字從右到左依次乘1、2、3、4....8。
- 求出(2),(3)之和 。
- 求出(4)除10後之餘數,用10減該餘數,結果就是檢查碼,若餘數為0,檢查碼就是 0。
例如: 身分證號碼是 F121955337
F 1 2 1 9 5 5 3 3
1 5 x x x x x x x x x x
1 9 8 7 6 5 4 3 2 1
─────────────────────
1+45+8+14+6+45+20+15+6+3=163
163/10=16....3 (餘數)
10-3=7 (檢查碼)
=========================================================================
(1)身份證驗證 : 

Code:
Public Class Form5
'儲存第一碼(地址碼)所對應到的2碼數字.
Dim auth() As String = New String(25) {"A10", "J18", "S26", "B11", "K19", "T27", "C12", "L20", "U28", "D13", "M21", "V29", "E14", "N22", "W32", "F15", "O35", "X30", "G16", "P23", "Y31", "H17", "Q24", "Z33", "I34", "R25"}
Dim str As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
Dim a, b, ck As Double
str = Mid(TextBox1.Text, 1, 1) '取得第一碼英文字母.
For i = 0 To UBound(auth)
If str = Mid(auth(i), 1, 1) Then '比對陣列元素第一碼.
a = Val(Mid(auth(i), 2, 1)) 'a,b代表對映到的2碼.
b = Val(Mid(auth(i), 3, 1))
' 驗證規則.
ck = 10 - ((a + (b * 9 + Mid(TextBox1.Text, 2, 1) * 8 + Mid(TextBox1.Text, 3, 1) * 7 + Mid(TextBox1.Text, 4, 1) * 6 + Mid(TextBox1.Text, 5, 1) * 5 + Mid(TextBox1.Text, 6, 1) * 4 + Mid(TextBox1.Text, 7, 1) * 3 + Mid(TextBox1.Text, 8, 1) * 2 + Mid(TextBox1.Text, 9, 1) * 1)) Mod 10) 'Mid(TextBox1.Text,10,1) 為檢查碼.
If ck = Mid(TextBox1.Text, 10, 1) Then '取得第十碼檢查碼做比對.
MsgBox("驗證成功!" & "檢查碼是 :" & ck)
Else
MsgBox("驗證失敗!")
End If
End If
Next
End Sub
End Class
===========================================
設計心得 :
(1) 字串拆解比對應用.
(2) 一維陣列的走訪(Traverse)應用. PS : 在迴圈內逐一比對陣列元素.
凡事,總有更輕鬆的解決方法。