ASP.NET C#
驗證身分證字號的正確性有一定的規則存在
A123456789
這是對的還是錯的呢?
不要懷疑 這組身分證字號看起來很像是隨便打的
但是這一組身分證字號卻是正確的
當事者可是對這個身分證字號很苦惱呢
因為簡單到超容易被盜用
一般人亂打想要通過身分證字號檢查是不大可能的
錯誤的機率太大了
第一碼的英文字母代表著地區
以上是各字母所代表的值
第二碼的數值代表性別:1男性2女性
性別也只有這兩種 不會有第三個啦
而第三到第九碼則為流水號
沒有特別規則的
第十碼為檢查碼
不管你前面是如何亂打 只要第10碼湊起來就是合理的
計算方式如下
範例:A123456789
A->對照上表得"10"
而得出來的10可不能直接計算
要拆成兩碼
例如A->10要拆為1,0
I->34要拆成3,4
另一個計算對照表如下
應該很淺顯易懂吧
1 x 1
0 x 9
1 x 8
2 x 7
3 x 6
4 x 5
5 x 4
6 x 3
7 x 2
+)8 x 1
-----
= 121
這時候檢查碼就派上用場了
為什麼檢查碼是9而不是別的數字
Total%10=0
才表示結果正確
所以121+9=130
130%10剛好就是0
這就是檢查碼的用途
來個程式實例吧
private void checkId(string user_id, string state) //檢查身分證字號
{
int[] uid = new int[10]; //數字陣列存放身分證字號用
int chkTotal; //計算總和用
if (user_id.Length == 10) //檢查長度
{
user_id = user_id.ToUpper(); //將身分證字號英文改為大寫
//將輸入的值存入陣列中
for (int i = 1; i < user_id.Length; i++)
{
uid[i] = Convert.ToInt32(user_id.Substring(i, 1));
}
//將開頭字母轉換為對應的數值
switch (user_id.Substring(0, 1).ToUpper())
{
case "A": uid[0] = 10; break;
case "B": uid[0] = 11; break;
case "C": uid[0] = 12; break;
case "D": uid[0] = 13; break;
case "E": uid[0] = 14; break;
case "F": uid[0] = 15; break;
case "G": uid[0] = 16; break;
case "H": uid[0] = 17; break;
case "I": uid[0] = 34; break;
case "J": uid[0] = 18; break;
case "K": uid[0] = 19; break;
case "L": uid[0] = 20; break;
case "M": uid[0] = 21; break;
case "N": uid[0] = 22; break;
case "O": uid[0] = 35; break;
case "P": uid[0] = 23; break;
case "Q": uid[0] = 24; break;
case "R": uid[0] = 25; break;
case "S": uid[0] = 26; break;
case "T": uid[0] = 27; break;
case "U": uid[0] = 28; break;
case "V": uid[0] = 29; break;
case "W": uid[0] = 32; break;
case "X": uid[0] = 30; break;
case "Y": uid[0] = 31; break;
case "Z": uid[0] = 33; break;
}
//檢查第一個數值是否為1.2(判斷性別)
if (uid[1] == 1 || uid[1] == 2)
{
chkTotal = (uid[0] / 10 * 1) + (uid[0] % 10 * 9);
int k = 8;
for (int j = 1; j < 9; j++)
{
chkTotal += uid[j] * k;
k--;
}
chkTotal += uid[9];
if (chkTotal % 10 != 0)
{
Response.Write("身分證字號錯誤");
}
}
else
{
Response.Write("身分證字號錯誤");
}
}
else
{
Response.Write("身分證字號長度錯誤");
}
}
以上
有問題再發問吧