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("身分證字號長度錯誤");
    }

}

 

以上

有問題再發問吧


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 jheng1212 的頭像
    jheng1212

    Kangaroo's Home

    jheng1212 發表在 痞客邦 留言(1) 人氣()