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

C# 中國身分證驗證(二):15/18 碼完整校驗邏輯實作

     編輯:關於C語言

總入口


private bool CheckIDCard(string id)
{
    if (id.Length == 18) return CheckIDCard18(id);
    if (id.Length == 15) return CheckIDCard15(id);
    return false;
}

18 碼驗證


private bool CheckIDCard18(string id)
{
    // 1. 數字檢查(前17碼純數字,最後一碼可為 X/x)
    if (!long.TryParse(id.Substring(0,17), out _) || !long.TryParse(id.Replace('x','0').Replace('X','0'), out _))
        return false;

    // 2. 地區碼檢查
    string areas = "11,22,35,44,53,12,23,36,45,54,13,31,37,46,61,14,32,41,50,62,15,33,42,51,63,21,34,43,52,64,65,71,81,82,91";
    if (!areas.Contains(id.Substring(0,2))) return false;

    // 3. 出生日期檢查
    string birth = id.Substring(6,8).Insert(6,"-").Insert(4,"-");
    if (!DateTime.TryParse(birth, out _)) return false;

    // 4. 校驗碼計算
    string[] verify = "1,0,X,9,8,7,6,5,4,3,2".Split(',');
    int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    int sum = 0;
    for (int i=0;i<17;i++) sum += weight[i] * (id[i]-'0');
    int mod = sum % 11;
    if (verify[mod] != id.Substring(17,1).ToUpper()) return false;

    return true; // 符合 GB11643-1999
}

15 碼驗證


private bool CheckIDCard15(string id)
{
    if (!long.TryParse(id, out _) || id.Length != 15) return false;
    string areas = "11,22,35,44,53,12,23,36,45,54,13,31,37,46,61,14,32,41,50,62,15,33,42,51,63,21,34,43,52,64,65,71,81,82,91";
    if (!areas.Contains(id.Substring(0,2))) return false;
    string birth = id.Substring(6,6).Insert(4,"-").Insert(2,"-");
    return DateTime.TryParse(birth, out _);
}

測試說明

  • 地區碼依 2003 年統計局資料,早期發證可能有出入。
  • 560 筆測試樣本中僅 2 筆未通過(推測為登記錯誤)。
  • 校驗通過不代表身分證真實(無市/縣碼驗證、無公安資料庫比對)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved