Python 我的程序似乎将所有内容都用作校验位,除了0,它将返回无效,即使它是有效的?

Python 我的程序似乎将所有内容都用作校验位,除了0,它将返回无效,即使它是有效的?,python,Python,例如,输入0-7487-4459-2将返回有效,但1-841-46202-0将返回无效,即使其有效???我真的不知道该怎么做,但我已经测试过了,看看什么是11%11,它的0所以0==0应该返回True,因此是有效的??我真的受不了这个 while True: # infinite loop until quit answer = input("Enter ISBN or enter q to quit") # enter number if answer == "q" or answer =

例如,输入
0-7487-4459-2
将返回有效,但
1-841-46202-0
将返回无效,即使其有效???我真的不知道该怎么做,但我已经测试过了,看看什么是
11%11
,它的0所以
0==0
应该返回True,因此是有效的??我真的受不了这个

while True:  # infinite loop until quit
answer = input("Enter ISBN or enter q to quit")  # enter number
if answer == "q" or answer == "Q":  # quit
    exit()
else:
    isbn = answer
    temp = ""  # temporary
    answer = ""  # set as isbn and reset 'answer'
    for x in range(len(isbn)):
        if ord(isbn[x]) == 45:
            print("", end="")  # print nothing when dash
        else:
            temp += isbn[x]  # add new code to temp

    isbn = temp  # reset temp
    temp = ""

    # RUN CHECKS ON ISBN
    if (len(isbn)) == 10:
        print("", end="")
    else:  # check length
        print("Incorrect length for isbn")
        exit()

    # CHECK DIGITS
    if isbn.isdigit() == True:
        print("", end="")
    else:
        print("Non number detected")
        exit()

    print(isbn)
    check = (isbn[len(isbn) - 1])  # add the last digit as check
    isbn = isbn[:-1]  # remove last digit as its check

    total = 0
    multi = 10
    for x in range(len(isbn)):
        temp = int(isbn[x])  # set it as int
        total += (temp * multi)  # times by multiplier and add to total
        multi -= 1  # take one

    answer = (11 - (total % 11))
    print(answer)  # modulo 11
    print(check)
    if int(check) == answer:  # check and print valid if valid

        print("Valid")
    else:
        print("Invalid")
控制台输出:

Enter ISBN or enter q to quit1-841-46202-0
1841462020
11
0
Invalid
Enter ISBN or enter q to quit
answer=(11-(总计%11))
只能生成范围为1到11(包括1到11)的结果,因此任何结果都不可能与检查数字0匹配。请尝试
answer=-total%11
,当您的原始答案为11时,它会给出0

任何一个版本都可以产生10作为答案,但不能匹配一个十进制数字。事实上,ISBN校验位是一个基数为11的数字,额外的可能值表示为“X”。当答案为10时,您需要添加一个特例来接受“X”-否则,您将拒绝大约9%的所有可能的ISBN。

answer=(11-(总计%11))
只能产生范围为1到11(包括11)的结果,因此任何结果都不可能匹配0的校验位。请尝试
answer=-total%11
,当您的原始答案为11时,它会给出0


任何一个版本都可以产生10作为答案,但不能匹配一个十进制数字。事实上,ISBN校验位是一个基数为11的数字,额外的可能值表示为“X”。当答案为10时,您需要添加一个特例来接受“X”——否则,您将拒绝所有可能的ISBN的9%。

您永远不会执行评估11%11。您计算了整个数字:总数%11。这两项的总数分别为262和187。你所做的计算从11中减去。啊。。。jasonharper刚刚发布了那个部分

要将ISBN的其余部分转换成一个数字,需要做大量的工作。你可以用一句简单的话来解决这个问题:

total = int(isbn[:-1])

您从未执行过评估11%11。您计算了整个数字:总数%11。这两项的总数分别为262和187。你所做的计算从11中减去。啊。。。jasonharper刚刚发布了那个部分

要将ISBN的其余部分转换成一个数字,需要做大量的工作。你可以用一句简单的话来解决这个问题:

total = int(isbn[:-1])

好的,谢谢,好的回答,都很有帮助,而且现在它正在使用X,X和0!好的,谢谢,好的回答,都很有帮助,而且现在它正在使用X,X和0!