如何检查字符串输入是不是为数字?
Posted
技术标签:
【中文标题】如何检查字符串输入是不是为数字?【英文标题】:How to check if string input is a number?如何检查字符串输入是否为数字? 【发布时间】:2011-07-22 10:27:39 【问题描述】:如何检查用户输入的字符串是否为数字(例如-1
、0
、1
等)?
user_input = input("Enter something:")
if type(user_input) == int:
print("Is a number")
else:
print("Not a number")
上述方法不起作用,因为input
总是返回一个字符串。
【问题讨论】:
不知道在“输入总是返回字符串”中,“返回”是否正确。 看起来你正在使用 python 3.x 在这种情况下是的input
总是返回字符串。见:docs.python.org/release/3.1.3/library/functions.html#input
@DanielDiPaolo:哦,是的,我知道这一点,因此问题是,我只是不知道 return 这个词是否正确。
啊,是的,“返回”这个词是正确的!
@Trufa if type(eval(user_input)) == int:
这可能有效。
【参考方案1】:
只需尝试将其转换为 int,然后如果它不起作用则退出。
try:
val = int(userInput)
except ValueError:
print("That's not an int!")
见官方教程Handling Exceptions。
【讨论】:
如果你只想要整数值而不是浮点数,请使用val = int(str(userInput))
这也不适用于布尔值 int(True) == 1
和 int(False) == 0
【参考方案2】:
显然这不适用于负值,但它适用于正数。
使用isdigit()
if userinput.isdigit():
#do stuff
【讨论】:
"-1".isdigit() == False 我不这么认为,Llopis。当我给出这个答案时,我有点急于回答问题。我会和 Daniel DiPaolo 对 int 的回答一样,但使用 float() 而不是 int()。 负数和浮点数返回 false,因为 '-' 和 '.'不是数字。 isdigit() 函数检查字符串中的每个字符是否在 '0' 和 '9' 之间。 使用isdecimal
而不是isdigit
,因为isdigit
是一个不安全的测试,它将unicode power-of-2, ² 等字符识别为无法转换为整数的数字。跨度>
【参考方案3】:
isnumeric()
方法将完成这项工作 (Documentation for python3.x):
>>>a = '123'
>>>a.isnumeric()
True
但请记住:
>>>a = '-1'
>>>a.isnumeric()
False
isnumeric()
如果字符串中的所有字符都是数字字符,并且至少有一个字符,则返回 True。
所以不接受负数。
【讨论】:
值得注意的是,在 Python 2.7 中,这只适用于 unicode 字符串。非 unicode 字符串 ("123456".isnumeric()
) 产生 AttributeError: 'str' object has no attribute 'isnumeric'
,而 U"12345".numeric()
= True
此外,在某些极端情况下这不起作用。采取a = '\U0001f10a'
。 a.isnumeric()
是 True,但 int(a)
会引发 ValueError。
'3.3'.isnumeric()
是False
'-11'.isnumeric() 为假【参考方案4】:
对于 Python 3,以下将起作用。
userInput = 0
while True:
try:
userInput = int(input("Enter something: "))
except ValueError:
print("Not an integer!")
continue
else:
print("Yes an integer!")
break
【讨论】:
【参考方案5】:编辑: 您还可以使用下面的代码来确定它是数字还是负数
import re
num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$")
isnumber = re.match(num_format,givennumber)
if isnumber:
print "given string is number"
您还可以根据您的具体要求更改格式。 我看到这篇文章有点太晚了。但希望这可以帮助其他正在寻找答案的人:)。如果给定的代码有什么问题,请告诉我。
【讨论】:
这将检查字符串中是否有数字(浮点数、整数等)。但是,如果不仅仅是数字,它仍然会返回结果。例如:“1.2 Gbps”将返回误报。这对某些人可能有用,也可能没用。 另请注意:对于现在正在查看的任何人,我的原始评论不再有效。 :P 感谢@karthik27 的更新!【参考方案6】:如果您特别需要 int 或 float,您可以尝试“is not int”或“is not float”:
user_input = ''
while user_input is not int:
try:
user_input = int(input('Enter a number: '))
break
except ValueError:
print('Please enter a valid number: ')
print('You entered '.format(user_input))
如果您只需要使用整数,那么我见过的最优雅的解决方案是“.isdigit()”方法:
a = ''
while a.isdigit() == False:
a = input('Enter a number: ')
print('You entered '.format(a))
【讨论】:
【参考方案7】:适用于检查 input 是否为 特定范围内的正整数 AND
def checkIntValue():
'''Works fine for check if an **input** is
a positive Integer AND in a specific range'''
maxValue = 20
while True:
try:
intTarget = int(input('Your number ?'))
except ValueError:
continue
else:
if intTarget < 1 or intTarget > maxValue:
continue
else:
return (intTarget)
【讨论】:
【参考方案8】:我会推荐这个,@karthik27,用于负数
import re
num_format = re.compile(r'^\-?[1-9][0-9]*\.?[0-9]*')
然后用那个正则表达式做任何你想做的事情,match(),findall() 等等
【讨论】:
好主意。干净实用。虽然它需要针对特定情况进行一些更改,但说它目前也匹配 3.4.5 为什么不只是:num_format = re.compile(r'^\-?[1-9]+\.?[0-9]*')
而只是转换为浮点数【参考方案9】:
最优雅的解决方案是已经提出的,
a=123
bool_a = a.isnumeric()
不幸的是,它不适用于负整数和 a 的一般浮点值。如果您的目的是检查“a”是否是整数之外的通用数字,我建议使用以下一个,它适用于每种浮点数和整数:)。这是测试:
def isanumber(a):
try:
float(repr(a))
bool_a = True
except:
bool_a = False
return bool_a
a = 1 # integer
isanumber(a)
>>> True
a = -2.5982347892 # general float
isanumber(a)
>>> True
a = '1' # actually a string
isanumber(a)
>>> False
我希望你觉得它有用:)
【讨论】:
如果转换没有失败,这将返回float
,而不是bool
。
感谢 Carpetsmoker 你是对的 :) 已修复!【参考方案10】:
自然:[0, 1, 2 ... ∞]
Python 2
it_is = unicode(user_input).isnumeric()
Python 3
it_is = str(user_input).isnumeric()
整数:[-∞, .., -2, -1, 0, 1, 2, ∞]
try:
int(user_input)
it_is = True
except ValueError:
it_is = False
浮点数:[-∞, .., -2, -1.0...1, -1, -0.0...1, 0, 0.0...1, ... , 1, 1.0...1, ..., ∞]
try:
float(user_input)
it_is = True
except ValueError:
it_is = False
【讨论】:
如果您不介意,我想知道这个答案有什么问题。可能有更好的方法来执行我愿意知道的这项任务 没有错。人们只是不理解你陈述的条件。【参考方案11】:您可以对字符串使用 isdigit() 方法。 在这种情况下,正如您所说,输入始终是一个字符串:
user_input = input("Enter something:")
if user_input.isdigit():
print("Is a number")
else:
print("Not a number")
【讨论】:
【参考方案12】:这个解决方案只接受整数,只接受整数。
def is_number(s):
while s.isdigit() == False:
s = raw_input("Enter only numbers: ")
return int(s)
# Your program starts here
user_input = is_number(raw_input("Enter a number: "))
【讨论】:
【参考方案13】:这适用于任何数字,包括分数:
import fractions
def isnumber(s):
try:
float(s)
return True
except ValueError:
try:
Fraction(s)
return True
except ValueError:
return False
【讨论】:
【参考方案14】:为什么不将输入除以一个数字?这种方式适用于一切。负数、浮点数和负数浮点数。还有空格和零。
numList = [499, -486, 0.1255468, -0.21554, 'a', "this", "long string here", "455 street area", 0, ""]
for item in numList:
try:
print (item / 2) #You can divide by any number really, except zero
except:
print "Not A Number: " + item
结果:
249
-243
0.0627734
-0.10777
Not A Number: a
Not A Number: this
Not A Number: long string here
Not A Number: 455 street area
0
Not A Number:
【讨论】:
这仅适用于您的数字是数字类型。 “8”(str 类型)的输入将是“Not A Number”。【参考方案15】:我知道这已经很晚了,但它可以帮助其他不得不花费 6 个小时来解决这个问题的人。 (这就是我所做的):
这完美无缺:(检查输入中是否有任何字母/检查输入是整数还是浮点数)
a=(raw_input("Amount:"))
try:
int(a)
except ValueError:
try:
float(a)
except ValueError:
print "This is not a number"
a=0
if a==0:
a=0
else:
print a
#Do stuff
【讨论】:
如果您输入0
,则不起作用,这是OP特别提到的示例之一。【参考方案16】:
这是一个检查 INT 和 RANGE 输入的简单函数。这里,如果输入是 1-100 之间的整数,则返回 'True',否则返回 'False'
def validate(userInput):
try:
val = int(userInput)
if val > 0 and val < 101:
valid = True
else:
valid = False
except Exception:
valid = False
return valid
【讨论】:
欢迎来到 Stack Overflow!这是一个老问题,接受的答案似乎还不错。您确定要添加新内容吗? 我认为这是一个轻微的改进:在避免嵌套 if-else 的同时效率不低。我是新来的,如果答案伤害了社区,如果它被删除,我不会感到难过。【参考方案17】:我一直在使用我认为我会分享的不同方法。从创建一个有效范围开始:
valid = [str(i) for i in range(-10,11)] # ["-10","-9...."10"]
现在询问一个数字,如果不在列表中继续询问:
p = input("Enter a number: ")
while p not in valid:
p = input("Not valid. Try to enter a number again: ")
最后转换为 int(这会起作用,因为 list 只包含整数作为字符串:
p = int(p)
【讨论】:
【参考方案18】:这是最简单的解决方案:
a= input("Choose the option\n")
if(int(a)):
print (a);
else:
print("Try Again")
【讨论】:
SyntaxError: 'return' outside function
。此外,a is int
永远不会评估为 True
。
感谢@N.Wouda 的帮助,我已经进行了更改,请检查此
您确定您的回答实际上对这个问题有所贡献吗?
@N.Wouda 实际上我正处于学习阶段并试图帮助他人,所以他们不会陷入这些基本问题。
如果 'a' 是一个字符串,int(a) 会抛出一个异常并且永远不会调用 'else' 分支。在 python 2 和 3 中测试。【参考方案19】:
while True:
b1=input('Type a number:')
try:
a1=int(b1)
except ValueError:
print ('"%(a1)s" is not a number. Try again.' %'a1':b1)
else:
print ('You typed "".'.format(a1))
break
这会创建一个循环来检查输入是否为整数,结果如下所示:
>>> %Run 1.1.py
Type a number:d
"d" is not a number. Try again.
Type a number:
>>> %Run 1.1.py
Type a number:4
You typed 4.
>>>
【讨论】:
【参考方案20】:如果您想计算浮点数,并且您想接受 NaN
s 作为输入,但不接受像 'abc'
这样的其他字符串,您可以执行以下操作:
def isnumber(x):
import numpy
try:
return type(numpy.float(x)) == float
except ValueError:
return False
【讨论】:
【参考方案21】:今天早上我也遇到了问题,用户无法对我的特定整数请求输入非整数响应。
这是最终对我来说效果很好的解决方案,可以强制给出我想要的答案:
player_number = 0
while player_number != 1 and player_number !=2:
player_number = raw_input("Are you Player 1 or 2? ")
try:
player_number = int(player_number)
except ValueError:
print "Please enter '1' or '2'..."
在我使用 try: 语句之前,我会遇到异常
player_number = int(raw_input("Are you Player 1 or 2? ")
并且用户输入了“J”或任何其他非整数字符。最好将其作为原始输入,检查该原始输入是否可以转换为整数,然后再进行转换。
【讨论】:
最好只捕获您正在处理的异常。在这种情况下,它将是ValueError
。
感谢您的提示!我已经编辑了解决方案以包含该反馈。那是我的第一个 SO 解决方案!【参考方案22】:
试试这个!即使我输入负数,它也对我有用。
def length(s):
return len(s)
s = input("Enter the String: ")
try:
if (type(int(s)))==int :
print("You input an integer")
except ValueError:
print("it is a string with length " + str(length(s)))
【讨论】:
【参考方案23】:您可以输入:
user_input = input("Enter something: ")
if type(user_input) == int:
print(user_input, "Is a number")
else:
print("Not a number")
try:
val = int(user_input)
except ValueError:
print("That's not an int!")
【讨论】:
【参考方案24】:这将起作用:
print(user_input.isnumeric())
这会检查字符串中是否有 only 个数字并且长度至少为 1。
但是,如果您尝试使用带有负数的字符串的 isumeric,则 isumeric 将返回 False
。
现在这是一个适用于负数和正数的解决方案
try:
user_input = int(user_input)
except ValueError:
process_non_numeric_user_input() # user_input is not a numeric string!
else:
process_user_input()
【讨论】:
【参考方案25】:检查Decimal
类型:
import decimal
isinstance(x, decimal.Decimal)
【讨论】:
【参考方案26】:基于答案的灵感。我定义了一个函数如下。看起来它工作正常。如果您发现任何问题,请告诉我
def isanumber(inp):
try:
val = int(inp)
return True
except ValueError:
try:
val = float(inp)
return True
except ValueError:
return False
【讨论】:
【参考方案27】:a=10
isinstance(a,int) #True
b='abc'
isinstance(b,int) #False
【讨论】:
以上是关于如何检查字符串输入是不是为数字?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript - 如何检查是不是在数字输入字段中输入了字母字符或符号[重复]
在将字符串转换为 int 之前检查字符串是不是不是数字 [重复]