0

我正在制作一个 ISBN 校验位程序。然而,虽然我已经让我的程序只接受长度为 10 的值,但如果我输入 10 个字母,它会崩溃。

有谁知道如何解决这一问题?

我的代码:

isbnnumber = input('Please input your 10 digit book no. : ')
while len(isbnnumber) != 10:
    print('You have not entered a 10 digit value! Please try again.')
    isbnnumber = input('Please input your 10 digit book no. : ')
else:
    no1 = int(isbnnumber[0])*11
    no2 = int(isbnnumber[1])*10... etc...

非常感谢您的帮助,谢谢。

4

4 回答 4

3

您可以使用str.isdigit来测试字符串是否全为数字:

while len(isbnnumber) != 10 or not isbnnumber.isdigit():

请看下面的演示:

>>> '123'.isdigit()
True
>>> '123a'.isdigit()
False
>>>
>>>
>>> isbnnumber = input('Please input your 10 digit book no. : ')
Please input your 10 digit book no. : 123
>>> while len(isbnnumber) != 10 or not isbnnumber.isdigit():
...     print('You have not entered a 10 digit value! Please try again.')
...     isbnnumber = input('Please input your 10 digit book no. : ')
...
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 123456789
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 123456789a
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 1234567890
>>>
于 2014-04-29T21:42:23.287 回答
1

请注意,不仅有 ISBN-10,还有 ISBN-13(实际上在全球范围内更常用)。此外,ISBN-10 不必全是数字:一个数字是校验和,可以计算为字母“X”(当它在数字上改为 10 时)。当你在做的时候:检查那些校验和数字;他们在那里是有原因的。

所以我建议你做一些辅助功能:

def is_valid_isbn(isbn):
    return is_valid_isbn10(isbn) or is_valid_isbn13(isbn)

def is_valid_isbn10(isbn):
    # left as an exercise
    return len(...) and isbn10_validate_checksum(isbn)

def is_valid_isbn13(isbn):
    # left as an exercise
    return len(...) and isbn13_validate_checksum(isbn)

并按如下方式实现您的输入循环:

valid_isbn=False
while not valid_isbn:
    isbn = input('Please input your ISBN: ')
    valid_isbn = is_valid_isbn(isbn) and isbn # and part is optional, little trick to save your isbn directly into the valid_isbn variable when valid, for later use.
于 2014-04-29T22:14:44.857 回答
0

您可以将 while 循环的条件替换为检查数字的更丰富的条件,例如:

while not isbnnumber.isdigit() or len(isbnnumber) != 10:    
于 2014-04-29T21:45:05.117 回答
0

使用正则表达式,您可以准确地测试给定字符串的定义格式。

import re

m = re.match(r'^\d{10}$', isbn)
if m:
    # we have 10 digits!

这里的正则表达式是\d{10}. \d手段,你正在寻找一个数字,手段{10},你正好需要十个。^标记字符串的开头和字符串的$结尾。

使用正则表达式并不总是你需要的,如果你是第一次使用它们,你需要一些时间来理解。但是正则表达式是最强大的开发工具之一。

于 2014-04-30T07:05:47.837 回答