鱼C论坛

 找回密码
 立即注册
查看: 1780|回复: 3

[作品展示] 车架号校验规则实现

[复制链接]
发表于 2020-11-23 17:06:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
        if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
        else:
            count1 = count1 + 0

    if len(vin) != 17 :
        print("车架号不为17位")
    elif count1 != 17 :
        print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
        print("车架号不应该存在O、I、Q字母")
    else:
        for (y1,y2) in zip(vin,[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2]):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
        check = weighted % 11 # 用%获取余数
        if (check == int(vin[8])) or ((check == 10) and (vin[8] == "x")):#vin[8]切片为str类型,需要转化为int,注意用括号隔开判断条件
            print("车架号符合规则,校验通过")
        else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写


其实,非常郁闷的事情是.isalnum方法,明明是(判断是否数字和字母的组合),为什么汉字也给我返回一个Ture?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-23 20:27:07 | 显示全部楼层
汉字会被判定为字母
解决办法:.encode('utf-8').isalnum
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-24 16:37:23 | 显示全部楼层
校验码如果是X将会导致错误,调整一下

# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})
dict2 = dict({'x':10,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
        if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
        else:
            count1 = count1 + 0

    if len(vin) != 17 :
        print("车架号不为17位")
    elif count1 != 17 :
        print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
        print("车架号不应该存在O、I、Q字母")
    else:
        for (y1,y2) in zip(vin,[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2]):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
        check = weighted % 11 # 用%获取余数
        if check == dict2.get(vin[8]): #vin[8]可能是x,使用int会报错,调整为字典方法对比校验码
            print("车架号符合规则,校验通过")
        else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-24 16:56:10 | 显示全部楼层
突然想起 vin[8] 如果是错误的车架号 可能不是0-9、x 而是a、b之类的其他字母,再次调整一下

# 车架号校验函数
VIN = input("请输入车架号")
vin = str.lower(VIN)#转化为小写
letter = "0123456789abcdefghijklmnopqrstuvwxyz"#字母数字集合
dict1 = dict({'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,'g':7,'h':8,'j':1,'k':2,'l':3,'m':4,'n':5,'p':7,'r':9,'s':2,'t':3,'u':4,'v':5,'w':6,'x':7,'y':8,'z':9,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})
dict2 = dict({'a':100,'b':100,'c':100,'d':100,'e':100,'f':100,'g':100,'h':100,'j':100,'k':100,'l':100,'m':100,'n':100,'p':100,'r':100,'s':100,'t':100,'u':100,'v':100,'w':100,'x':10,'y':100,'z':100,'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9})

while True:
    count1 = 0#辅助判断
    weighted = 0 #加权
    check = 0 #校验码
# 以下部分判断是否全部为数字字母
    for each in vin:
        if each in letter:#用in判断是否包含在字母数字集合内
            count1 = count1 + 1
        else:
            count1 = count1 + 0

    if len(vin) != 17 :
        print("车架号不为17位")
    elif count1 != 17 :
        print("车架号只能为数字与字母的组合")
    elif "o"in vin or "i"in vin or "q"in vin:
        print("车架号不应该存在O、I、Q字母")
    else:
        for (y1,y2) in zip(vin,[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2]):#两个参数的for 应该用zip实现
            weighted = weighted + dict1.get(y1)*y2 #get方法获取dict对应的value
        check = weighted % 11 # 用%获取余数
        if check == dict2.get(vin[8]): #vin[8]可能是x,使用int会报错,调整为字典方法对比校验码
            print("车架号符合规则,校验通过")
        else:
            print("车架号不符合规则,校验未通过")
    VIN = input("请输入车架号")
    vin = str.lower(VIN)#转化为小写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 14:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表