ValueError: 非数字的无效整数字面值
我正在尝试创建一个简单的程序,目的是读取一个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的回答给你提供了一个很好的例子,说明这样的过程最终会带你到哪里。