ValueError:int()的文字无效,非数字的基数为10

时间:2012-02-16 13:56:30

标签: python python-3.x int

我正在尝试创建一个简单的程序,读取一个4位数的字符串,确保它确实是4位数,确保没有非数字,然后将前两位数与前两位数分开并将它们加在一起。我可以完成所有工作,但我仍然遇到这个错误:

ValueError: invalid literal for int() with base 10:

只有当我尝试使用'456f'这样的字符串时才会发生这种情况。

我可以改变什么来解决这个问题?

代码:

    s = input('please type a 4-digit integer \n')
valid = True
for c in s:
    if len(s)!= 4:
        valid = False
    if not c.isdigit():
        print (c, 'is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
if valid == True:
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))
else:
    print(len(s), 'is an invalid amount of digits')

4 个答案:

答案 0 :(得分:4)

您正在检查所有字符是否都是数字,但此检查没有任何后果 - 即使找到无效字符也只是继续。这使代码失败并显示引用的错误消息。

我建议使用专用函数来读取重复查询的整数,直到获得有效输入:

def input_int_digits(prompt, digits=4):
    while True:
        s = input(prompt).strip()
        if len(s) == digits and s.isdigit():
            return int(s)
        print("Invalid input -- {}-digit integer expected.".format(digits))

请注意,我使用str.strip()删除了前导或尾随的whitepsace,而str.isdigit()检查字符串的所有字符是否都是数字 - 您不需要遍历字符串。

答案 1 :(得分:3)

让我们关注这段代码:

for c in s:
    if len(s)!= 4:
        valid = False
    if not c.isdigit():
        print (c, 'is not a valid input')
number = int(s)

首先要说的是len()检查应移到字符循环之外。

if len(s)!= 4:
    valid = False
for c in s:
    ...

下一个要做的评论是,当您检测到非数字时,您继续执行代码,就像没有错误一样。您可能打算将valid设置为False

if not c.isdigit():
    print (c, 'is not a valid input')
    valid = False

现在,问题的主要部分。当检测到无效输入时,您需要跳转到int

if valid:
    number = int(s)
    ...

如果您想继续使用这种方法,您的代码将如下所示:

valid = True
s = input('please type a 4-digit integer \n')
if len(s)!= 4:
    valid = False
    print(len(s), 'is an invalid amount of digits')

if valid:
    for c in s:
        if not c.isdigit():
            valid = False
            print (c, 'is not a valid input')

if valid:
    number = int(s)
    firstOne = number // 100
    secondOne = number % 100
    sum = firstOne + secondOne
    x = '/'
    print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))

说完所有这些之后,我可能会在检测到错误后立即重新组织代码以处理错误。如果您能以这种方式组织错误处理,则代码更容易理解。

s = input('please type a 4-digit integer \n')
if len(s)!= 4:
    sys.exit(str(len(s)) + ' is an invalid amount of digits')
for c in s:
    if not c.isdigit():
        sys.exit(c + ' is not a valid input')
number = int(s)
firstOne = number // 100
secondOne = number % 100
sum = firstOne + secondOne
x = '/'
print('your integer is ' + str(number), x, 'first two digits are ' + str(firstOne), x, 'second two digits are ' + str(secondOne), x, 'sum of two new numbers is ' + str(sum))

现在,这是一个正确方向的开始,但你可以继续这样做,使代码更好,更好。 Sven's answer可以很好地说明这样一个过程最终会导致什么。

答案 2 :(得分:2)

怎么样?
...
valid = len(s) == 4 and all(c.isdigit() for c in s)
if not valid:
    print (c, 'is not a valid input')
...

甚至更好(谢谢,Sven!)

...
valid = len(s) == 4 and s.isdigit()
...

答案 3 :(得分:0)

在检查isdigit时,如果字符串包含非数字但仍然在所有s上调用int(),则会打印错误消息 您需要在“不是有效输入”消息后退出程序

您可以将打印更改为

sys.exit("is not a valid input")