身份证号具有唯一标志性,从身份证号我们能得到他的户籍所在地:省市县、出生年月、性别等情况。现在二代身份证号都是18位。小小身份证号可以大有玄机的。
前1、2位数字表示:所在省(直辖市、自治区)的代码;
第3、4位数字表示:所在地级市(自治州)的代码;
第5、6位数字表示:所在区(县、自治县、县级市)的代码;
第7—14位数字表示:出生年、月、日;
第15、16位数字表示:所在地的派出所的代码(身份证背面的签发机关);
第17位数字表示性别:奇数表示男性,偶数表示女性;
第18位数字是校检码(个人信息码)(有的人是可能是x,这代表的是10罗马数字);
判断身份证号是否合理:
public static bool CheckChinaIDCardNumberFormat(string idCardNumber)
{
string idNumber = idCardNumber;
bool result = true;
try
{
if (idNumber.Length != 18)
{
return false;
}
long n = 0;
if (long.TryParse(idNumber.Remove(17), out n) == false
|| n < Math.Pow(10, 16) || long.TryParse(idNumber.Replace('x', '0').Replace('X', '0'), out n) == false)
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(idNumber.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = idNumber.Substring(6, 8).Insert(6, "-").Insert(4, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
char[] Ai = idNumber.Remove(17).ToCharArray();
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
}
int y = -1;
Math.DivRem(sum, 11, out y);
if (arrVarifyCode[y] != idNumber.Substring(17, 1).ToLower())
{
return false;//校验码验证
}
return true;//符合GB11643-1999标准
}
catch (Exception ex)
{
logger.Error("CheckChinaIDCardNumber 身份证校验失败 号码:" + idNumber, ex);
result = false;
}
return result;
}