一、身份证号码是由18位数字组成,分别表示:
(1)第1、2位数字表示:所在省份的代码
(2)第3、4位数字表示:所在城市的代码
(3)第5、6位数字表示:所在区县的代码
(4)第7-14位数字表示:出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日)
(5)第15-17位都是同一地址辖区内的,以及同年同月同日出生人的顺序码,同时第17位兼具性别标识功能,男单女双
(6)第18位数字是校验码:可以是0-9的数字,有时也用X表示。
二、校验码:
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第 十七位的系数分别为:
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2、将这17位数字和系数相乘的结果相加
3、用加出来和除以11,看余数是多少
4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2
5、通过上面得知如果余数是2,余数所对应的最后一位身份证号是X,就会在身份证的第18位数字上出现罗马数字的X。
例如:某男性的身份证号码是34 05 2419800101 001X。我们要看看这个身份证是不是合法的身份证。
首先:我们计算3*7+4*9+0*10+5*5+.. +1*2,前17位的乘积和是189
然后:用189除以11得出的结果是商17余2
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
三、相关验证代码
import time
def check_id_length(n):
if len(str(n)) != 18:
print("只支持18位身份证号查询")
return False
else:
return True
def check_id_data(n):
n = str(n)
n2 = str(n[:16])
time_now = int(time.strftime("%Y",time.localtime()))
is_digit = (not(n2.isdigit())) or (not(n[17].isdigit()) and (n[17]) !="x")
if (is_digit):
print("对不起,您这是火星身份证,暂不受理")
elif (int(n[6:10]))>time_now:
print(n[6:10],"年的人?您是穿越回来吗?")
elif (int(n[10:12]))>12:
print(n[10:12],"月出生?,您是捡来的吧!!")
elif (int(n[12:14]))>31:
print(n[12:14],"日出生?,您一定是充话费送的")
else:
check_id_data2(n)
def check_id_data2(n):
var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
var_id=['1','0','x','9','8','7','6','5','4','3','2']
sum = 0
if int(n[16])%2==0:
gender="女"
same=int(int(n[16])/2)
else:
gender="男"
same=int((int(n[16])+1)/2)
for i in range(0,17):
sum += int(n[i])*var[i]
sum %= 11
if (var_id[sum])==str(n[17]):
print("身份证号规则核验通过,校验码是:",var_id[sum])
print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
return sum
else:
print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
return 0
while(1):
print("\n菜单,请输入数字\n----------------------")
print("输入1手动输入身份证号")
print("输入2选择测试号")
print("不然就拜拜")
print("----------------------")
select = input("\n请输入:")
if (select.isdigit()):
pass
else:
print("说好的输入数字的呢,拜拜了您嘞")
break
select = int(select)
if (select == 1):
n = input("请输入18位身份证号:")
if check_id_length(n):
check_id_data(n)
else:
print("请重新输入")
elif select == 2:
print("\n----------------------")
print("开始校验身份证号:61011519920317602")
check_id_length(61011519920317602)
print("\n----------------------")
print("开始校验身份证号:610115199203176021")
check_id_data(610115199203176021)
print("\n----------------------")
print("开始校验身份证号:610115199203176028")
check_id_data(610115199203176028)
else:
break
原文链接:使用 python 进行身份证号校验_使用python制作一个程序 1、制作一个可以输入一个身份证号码的输入框。 2、输入如“431202-CSDN博客