首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 15 碼身分證升級 18 碼演算法完整實作

     編輯:關於C#

背景

舊版身分證 15 碼 (6 碼地址 + 6 碼出生年月日 + 3 碼順序碼),新版擴充為 18 碼:插入「19」作世紀碼、增加校驗碼。

演算法步驟

  1. 取前 6 碼地址碼。
  2. 插入「19」→ 第 7-8 位。
  3. 接原 7-15 碼 (出生日期 + 順序碼) → 第 9-17 位。
  4. 加權求和:Wi = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}。
  5. 模 11:Y = Sum % 11。
  6. 查表:校驗碼 = "10X98765432"[Y] (索引 0-10)。
  7. 附加校驗碼 → 18 碼新身分證。

完整程式碼

public static string UpgradeId15To18(string id15)
{
    if (string.IsNullOrEmpty(id15) || id15.Length != 15)
        throw new ArgumentException("必須為 15 碼身分證");

    int[] weight = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    string checkCodes = "10X98765432";

    // 1-6 地址碼 + 19 + 7-15 出生順序
    string id17 = id15.Substring(0, 6) + "19" + id15.Substring(6, 9);

    // 加權求和
    int sum = 0;
    for (int i = 0; i < 17; i++)
        sum += (id17[i] - '0') * weight[i];

    // 校驗碼
    char check = checkCodes[sum % 11];
    return id17 + check;
}

// 測試
Console.WriteLine(UpgradeId15To18("429005811009091")); // 輸出 18 碼新身分證

驗證 18 碼身分證

public static bool ValidateId18(string id18)
{
    if (string.IsNullOrEmpty(id18) || id18.Length != 18) return false;
    int[] w = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    string codes = "10X98765432";
    int sum = 0;
    for (int i = 0; i < 17; i++)
        if (!char.IsDigit(id18[i])) return false;
        else sum += (id18[i] - '0') * w[i];
    char expected = codes[sum % 11];
    return char.ToUpper(id18[17]) == expected;
}

注意事項

  • 假設 15 碼年份皆為 19xx,若涵蓋 18xx/20xx 需額外判斷邏輯。
  • 輸入驗證:長度、數字字元、地址碼合法性 (可查戶政資料庫)。
  • 大小寫:校驗碼 X 不分大小寫。

小結

依照國標 GB 11643-1999 實作 15→18 碼轉換與驗證,核心為加權求和模 11 查表,程式碼簡潔易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved