ValueError: 非数字的无效整数字面值

2 投票
4 回答
10935 浏览
提问于 2025-04-17 13:07

我正在尝试创建一个简单的程序,目的是读取一个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 个回答

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()
...
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() 来去掉字符串前后的空格,并且 str.isdigit() 用来检查字符串中的所有字符是否都是数字——你不需要一个一个字符地去检查。

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的回答给你提供了一个很好的例子,说明这样的过程最终会带你到哪里。

撰写回答