C#實現的18位身份證格式驗證算法

2021-01-09 站長之家

18位身份證標準在國家質量技術監督局於1999年7月1日實施的GB11643-1999《公民身份號碼》中做了明確的規定。 GB11643-1999《公民身份號碼》為GB11643-1989《社會保障號碼》的修訂版,其中指出將原標準名稱"社會保障號碼"更名為"公民身份號碼",另外GB11643-1999《公民身份號碼》從實施之日起代替GB11643-1989。GB11643-1999《公民身份號碼》主要內容如下:
一、範圍
 該標準規定了公民身份號碼的編碼對象、號碼的結構和表現形式,使每個編碼對象獲得一個唯一的、不變的法定號碼。
二、編碼對象
 公民身份號碼的編碼對象是具有中華人民共和國國籍的公民。
三、號碼的結構和表示形式
1、號碼的結構
 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
2、地址碼
 表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。
3、出生日期碼
 表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。
4、順序碼
 表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。
5、校驗碼
(1)十七位數字本體碼加權求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先對前17位數字的權求和
Ai:表示第i位置上的身份證號碼數字值
Wi:表示第i位置上的加權因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)計算模
Y = mod(S, 11)
 
(3)通過模得到對應的校驗碼
Y: 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2
四、舉例如下:
北京市朝陽區: 11010519491231002X
廣東省汕頭市: 440524188001010014
 
 
 
以下是程序代碼:
private string CheckCidInfo(string cid)
 {
 string[] aCity = new string[]{null,null,null,null,null,null,null,null,null,null,null,"北京","天津","河北","山西","內蒙古",null,null,null,null,null,"遼寧","吉林","黑龍江",null,null,null,null,null,null,null,"上海","江蘇","浙江","安微","福建","江西","山東",null,null,null,"河南","湖北","湖南","廣東","廣西","海南",null,null,null,"重慶","四川","貴州","雲南","西藏",null,null,null,null,null,null,"陝西","甘肅","青海","寧夏","新疆",null,null,null,null,null,"臺灣",null,null,null,null,null,null,null,null,null,"香港","澳門",null,null,null,null,null,null,null,null,"國外"};
 double iSum=0;
 string info="";
 System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|x)$");
 System.Text.RegularExpressions.Match mc = rg.Match(cid);
 if(!mc.Success)
 {
 return "";
 }
 cid = cid.ToLower();
 cid = cid.Replace("x","a");
 if(aCity[int.Parse(cid.Substring(0,2))]==null)
 {
 return "非法地區";
 }
 try
 {
 DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
 }
 catch
 {
 return "非法生日";
 }
 for(int i=17;i>=0;i--)
 {
 iSum +=(System.Math.Pow(2,i)%11)*int.Parse(cid[17-i].ToString(),System.Globalization.NumberStyles.HexNumber);
 
 }
 if(iSum%11!=1)
 return("非法證號");
 
 return(aCity[int.Parse(cid.Substring(0,2))]+","+cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2)+","+(int.Parse(cid.Substring(16,1))%2==1¡"男":"女"));
 
 }
 
調用測試:
Response.Write(CheckCidInfo("340524198002300019"));
Response.Write(CheckCidInfo("34052419800101001x"));

相關焦點

  • 使用條件格式對身份證號碼查重,Excel錯的離譜,怎麼破?
    之前我們分享過關於數據核對與重複值的多種解決方式,今天我們來分享另外一個重複值問題,即身份證號碼重複。如圖,如果我們使用條件格式對這些身份證號碼進行重複值標記,發現標記的並不對,是Excel出錯了嗎?其實並不是,Excel有效數字的位數為15位,超過了之後就當做0來計算。
  • VB.NET實現身份證15位升18位的算法
    根據〖中華人民共和國國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。   地址碼表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼。
  • 身份證號一共18位,除了生日還有6大信息,很多人都不知道!
    身份證號一共18位,除了生日還有6大信息,很多人都不知道!如果說一個人最重要的證件是什麼,相信大多數都會說是「身份證」了,確實,身份證不管是我們平常要辦大小業務,還是出遠門,包括去個網吧、住個酒店等,都需要用到身份證。
  • Excel錄入身份證老出錯?簡單設置全部搞定
    在Excel中輸入身份證經常會出現一些錯誤,下面給大家演示在Excel中錄入身份證可能出現的三種錯誤和解決方法!1、身份證數據變成E+,後三位顯示0這個問題是大家比較常遇到的一個問題,在輸入18位身份證後變成E+並且後三位身份證顯示為0。
  • 分享下excel身份證號碼格式顯示方法,方便小妙招
    分享下excel身份證號碼格式顯示方法讓希望的種子生根發下,頂起一片天。獨白:一個簡單的操作,一份真誠的分享,現在分享下excel身份證號碼格式顯示方法的操作過程和技巧分享給大家,過程簡單看圖就會做,教程是自己原創的,其他分享平臺估計也能看到。
  • 你的身份證尾數是什麼?是「X」的人,原來是「特殊人群」!
    身份證是現在出門必須攜帶的證件了。現在你只要出去玩,去旅遊你必須要帶著身份證,要不然你連你自己的城市都出不去。身份證是在每人的成年之後才會發放。您的身份證結束號碼是多少呢? 一般都是數字結尾,很少有是「X」結尾的,現在才知道擁有「X」的人是「特殊人群」呢!由於第二代身份證更換之後,身份證的號碼已經變成了18位了,但為什麼我們可以在很快的時間裡熟練的記下來呢? 因為中間那段最長的就是我們的出生年月日了。 那麼身份證開頭和結尾的數字代表什麼意思呢? 為什麼有的人結束數字是「X」呢? 這個數字看起來就給人一種神秘的感覺。
  • excel函數應用:如何用數位函數分段提取身份證信息*下
    ()為2019-9-17,YEAR(TODAY())就是2019,YEAR(TODAY())&"-00-00"這樣的表達的格式就是"2019-00-00"(今年的生日日期),同理YEAR(TODAY())+1&"-00-00"代表"2020-00-00"的格式(次年的生日日期),用這個方式就確定了還有多少天慶生。
  • 如何用EXCEL自動提取身份證號中的出生日期和年齡?
    身份證號以一敵四第二步:如何在身份證號中提取出出生日期?在18位的身份證號中,第7位開始到第14位,這8位數字代表了這個人的出生日期。在這裡,可以用MID和TEXT兩個函數來製作公式。MID函數詳解:一、作用:此函數為文本函數,用於在文本字符串中,從指定起始位置起返回指定長度的字符。
  • Excel實用技巧分享:如何從身份證號中提取指定格式的出生日期?
    大家都知道身份證號碼中的第7位至第14位代表的是一個人的出生日期,其中7-10位是出生年份,11-12位是出生月份,13-14位是出生日。而我們在很多地方都需要用到出生日期,如果能夠直接從身份證號碼中把出生日期提取出來,特別是當人數較多時,無疑會節省很多時間,例如為學生建立學籍時。
  • 在Excel中使用TEXT函數提取身份證號碼中的生日
    如何提取身份證號碼中的生日,這個是很多同學在工作中使用Excel過程中,遇到的問題,也算是在學習Excel文本函數過程中的經典例子,主要涉及到了兩個文本函數;在學習之前,我們先看下身份證號碼的構成;(1)身份號碼一共18位,由17位數字和1位數字校驗碼組成:其中1~
  • 學會使用正則表達式——驗證郵箱地址格式
    先來一個簡單的正則表達式假如您要使用Python開發一個用戶註冊程序,需要驗證用戶輸入的郵箱地址格式是否正確,哪該怎麼編寫這個程序呢?要驗證郵箱地址的格式是否正確,需要先弄清楚郵箱地址的格式規則,有了郵箱地址的格式規則,就可以編寫正則表達式了。觀察郵箱地址,我們發現每個郵箱地址都包含「@」字符。
  • 身份證號18位數字,一共包含7大信息,你可能只看懂了生日!
    身份證號18位數字,一共包含7大信息,你可能只看懂了生日!現在很多人,特別是在校和剛畢業的大學生,都喜歡考證,因為我們有「藝多不壓身」這一說法,多會點東西總沒壞處。而在我國,有一樣證是不用考的,那就是身份證了,相信在大多數國家都是這個樣子。
  • 身份證號碼的數字代表什麼意義 18位身份證號碼的含義
    要知道我們每個人一出生,就意味著會有一個專屬自己的身份證號碼,這也是大家身份的證明,但你知道身份證號碼上面的數字有什麼含義嗎?下面一起來看看。首先大家要知道的一點是身份證號碼是有18位數組成的。其次,身份證號碼的1-2位表示省、自治區、直轄市代碼。
  • 身份證18位數究竟代表著什麼?為何有人最後一位是X,很特殊嗎?
    其實在古代時驗證身份的證件有分等級,例如高級官員用的叫做「符節」,上面有個人信息,身份職位,還有就是官員將士都在用的腰牌,這個我們比較熟悉,在古裝劇裡面出現最多的驗證身份的證件就是它了。那麼平民百姓用的是什麼呢?他們用的叫做「路引」,類似我們今天的通行證一樣,去哪裡,什麼時候,進出城都需要用到,沒有它就哪裡都去不了。在現代我們失去了身份證什麼都做不了,在古代也是如此。
  • 關於Excel中身份證號碼的8個技巧,你知道哪些?
    在Excel表格中,經常需要輸入身份證號碼,很多小夥伴很容易遇到一些問題,可能有些小夥伴知道怎麼解決,但是只是知其然而不知其所以然。今天我們就來講講關於身份證的相關技巧,一起學習吧~身份證號碼錄入關於身份證的輸入,初學Excel的童鞋一定會遇到以下問題,看看下面這個例子:
  • 身份證號前6位和後4位,總共包含了6大信息,看完漲知識了
    身份證號前6位和後4位,總共包含了6大信息,看完漲知識了只要是中國的合法公民,每個人年滿18歲的時候,都可以去辦理一張獨一無二的身份證。它不僅是個人身份的證明,現在去到哪裡都需要使用到。不管是去酒店、乘飛機、坐火車,還是到各個地方辦事,機會都需要身份驗證。
  • Excel知道身份證號怎麼計算年齡(周歲)?
    今天我們來解決知道身份證號怎麼計算年齡(周歲)的問題。一、18位身份證號我們先來介紹最常見的情況,身份證號全部是18位,如下圖。步驟如下:1.18位身份證號的編碼規則18位身份證號從第7位開始的連續8位代表本人的出生日期,比如:「513436198205079000」。
  • 身份證號第18位數字代表什麼 為啥有的人是X?
    原標題:身份證號第18位數字代表什麼,為啥有人是X?原來……  身份證號第17位數字代表了什麼?  身份證號碼由18位數組成:  (1)前1、2位數字表示:所在省份的代碼;  (2)第3、4位數字表示:所在城市的代碼;  (3
  • 史上最強:numpy 實現全部機器學習算法
    來源:SOTOM數據科學 來自於加州伯克利大學的David Bourgin 使用Numpy實現了幾乎全部的機器學習算法,真正實現了手擼ML的願景。多少「調包俠」的願望都被這位小哥實現了! 該項目超過3萬行代碼,除了算法本身,還有很多的數據預處理代碼!
  • 利用身份證號判斷性別、周歲、虛歲,提取生日——函數皆可盤
    身份證號共18位,利用函數可以從中判斷出很多信息。>=MID(字符串,開始位置,字符個數),所以=MID(B2,17,1)就是從身份證號的第17位開始,提取1個數。這裡如果我們直接用=TEXT(MID(F3,7,8),"0-00-00")的話,能統計出出生日期,但是它還是數值的格式,不方便我們進行篩選統計。所以這裡我們用DATE函數進行統計,=DATE(年,月,日),利用MID函數提前身份證號第7~10位為年,第11~12位為月,第13~14位為日。最後將生日列的日期格式根據需要設置為"mm/dd"即可。