您如何要求输入验证为10位数的整数?

时间:2014-04-29 21:38:32

标签: python python-3.x integer isbn

我正在制作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 个答案:

答案 0 :(得分: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
>>>

答案 1 :(得分: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.

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用regular expressions,您可以精确测试给定字符串的已定义格式。

import re

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

此处的正则表达式为\d{10}\d意味着,您正在寻找一个数字,{10}表示您需要十个数字。 ^标记字符串的开头,$标记字符串的结尾。

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