如何检查字符串输入是否为数字?

如何检查用户的字符串输入是否为数字(例如 -101等) ?

user_input = input("Enter something:")


if type(user_input) == int:
print("Is a number")
else:
print("Not a number")

由于 input总是返回一个字符串,因此上述方法不起作用。

793868 次浏览

只需尝试将其转换为 int 类型,如果不起作用就跳出来。

try:
val = int(userInput)
except ValueError:
print("That's not an int!")

请参阅官方教程中的 处理例外情况

显然这对负值不起作用,但对正数有效。

使用 isdigit()

if userinput.isdigit():
#do stuff

对于 Python3,以下内容将起作用。

userInput = 0
while True:
try:
userInput = int(input("Enter something: "))
except ValueError:
print("Not an integer!")
continue
else:
print("Yes an integer!")
break

这适用于任何数字,包括一个分数:

import fractions


def isnumber(s):
try:
float(s)
return True
except ValueError:
try:
Fraction(s)
return True
except ValueError:
return False

对于检查 输入是否正确,工作正常 特定范围内的正整数 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)

编辑: 您也可以使用下面的代码来确定它是一个数字还是一个负数

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"

你也可以改变你的格式,以满足你的特殊需求。 我看到这个帖子有点晚了,但是希望这能帮助其他寻找答案的人:)。如果给定代码中有任何错误请告诉我。

对于负数,我建议使用@karthik27

import re
num_format = re.compile(r'^\-?[1-9][0-9]*\.?[0-9]*')

然后对正则表达式 match ()、 findall ()等进行任何处理

今天早上我还遇到了一个问题,用户能够输入非整数响应来回应我对整数的特定请求。

这个解决方案最终对我起到了很好的作用,迫使我给出了我想要的答案:

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: 语句时,甚至在到达 try: 语句之前就会出现异常

player_number = int(raw_input("Are you Player 1 or 2? ")

用户输入“ J”或任何其他非整数字符。最好将其作为原始输入,检查原始输入是否可以转换为整数,然后再将其转换为整数。

我知道这是相当晚了,但它帮助任何其他人花了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

方法 isnumeric()将完成这项工作(Python3.x 文档) :

>>>a = '123'
>>>a.isnumeric()
True

但请记住:

>>>a = '-1'
>>>a.isnumeric()
False

如果字符串中的所有字符都是数字字符,并且至少有一个字符,则 isnumeric()返回 True。

所以负数不被接受。

:):):)

a=10


isinstance(a,int)  #True


b='abc'


isinstance(b,int)  #False

下面是一个检查 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

这是最简单的解决办法:

a= input("Choose the option\n")


if(int(a)):
print (a);
else:
print("Try Again")

最优雅的解决方案就是已经提出的,

a=123
bool_a = a.isnumeric()

不幸的是,它不能同时适用于负整数和一般的浮点值。如果你想检查“ 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

希望对你有用:)

基于答案的灵感。我定义了一个函数如下。看起来运行良好。如果你发现任何问题,请告诉我

def isanumber(inp):
try:
val = int(inp)
return True
except ValueError:
try:
val = float(inp)
return True
except ValueError:
return False
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.
>>>

如果希望计算 float,并且希望接受 NaN作为输入,但不接受其他字符串(如 'abc') ,则可以执行以下操作:

def isnumber(x):
import numpy
try:
return type(numpy.float(x)) == float
except ValueError:
return False

可以对字符串使用 isdigital ()方法。 在这种情况下,如您所说,输入始终是一个字符串:

    user_input = input("Enter something:")
if user_input.isdigit():
print("Is a number")
else:
print("Not a number")

如果您特别需要 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))

如果您只需要处理 int,那么我见过的最优雅的解决方案是“ . isdigital ()”方法:

a = ''
while a.isdigit() == False:
a = input('Enter a number: ')


print('You entered {}'.format(a))

我一直在使用一种我认为可以分享的不同的方法,首先创建一个有效的范围:

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 (这将工作,因为列表只包含整数作为字符串:

p = int(p)

为什么不把输入除以一个数字呢?这种方法适用于一切。负面,浮点,负面浮点。还有空格和零。

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:

自然 : [0,1,2... ∞]

巨蟒2

it_is = unicode(user_input).isnumeric()

巨蟒3

it_is = str(user_input).isnumeric()

整数 : [-∞ ,. . ,-2,-1,0,1,2,∞]

try:
int(user_input)
it_is = True
except ValueError:
it_is = False
 

Float : [-∞ ,. . ,-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

这个解决方案只接受整数,除了整数什么也不接受。

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: "))

试试这个! 即使我输入负数,它也对我有用。

  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)))

这将奏效:

print(user_input.isnumeric())

这将检查字符串中是否包含 只有数字并且长度至少为1。 但是,如果尝试使用带有负数的字符串 isnumeric,则 isnumeric 将返回 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()

你可以输入:

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!")

检查 Decimal类型:

import decimal
isinstance(x, decimal.Decimal)

我认为不做简单的事情一句话是不可能的。

没有 try..except的版本,使用正则表达式匹配:

密码:

import re


if re.match('[-+]?\d+$', the_str):
# is integer

测试:

>>> import re
>>> def test(s): return bool(re.match('[-+]?\d+$', s))


>>> test('0')
True
>>> test('1')
True
>>> test('-1')
True


>>> test('-0')
True
>>> test('+0')
True
>>> test('+1')
True




>>> test('-1-1')
False
>>> test('+1+1')
False




看起来到目前为止只有两个答案处理负数和小数(试试... 除了回答正则表达式1?).不久前在某个地方找到了第三个答案(尝试过搜索,但没有成功) ,它使用显式的直接检查每个字符而不是完整的正则表达式。

看起来它仍然比 try/Exception 方法慢很多,但是如果你不想搞乱它们,一些用例可能比正则表达式在大量使用时更好,特别是如果一些数字是短的/非负的:

>>> from timeit import timeit

Windows 上的 Python 3.10为我展示了具有代表性的结果:

显式检查每个字符 :

>>> print(timeit('text="1234"; z=text[0]; (z.isdigit() or z == "-" or z == ".") and all(character.isdigit() or character == "." for character in text[1:])'))
0.5673831000458449
>>> print(timeit('text="-4089175.25"; z=text[0]; (z.isdigit() or z == "-" or z == ".") and all(character.isdigit() or character == "." for character in text[1:])'))
1.0832774000009522
>>> print(timeit('text="-97271851234.28975232364"; z=text[0]; (z.isdigit() or z == "-" or z == ".") and all(character.isdigit() or character == "." for character in text[1:])'))
1.9836419000057504

尝试[例外]慢得多:

>>> def exception_try(string):
...   try:
...     return type(float(string)) == int
...   except:
...     return false


>>> print(timeit('text="1234"; exception_try(text)', "from __main__ import exception_try"))
0.22721579996868968
>>> print(timeit('text="-4089175.25"; exception_try(text)', "from __main__ import exception_try"))
0.2409859000472352
>>> print(timeit('text="-97271851234.28975232364"; exception_try(text)', "from __main__ import exception_try"))
0.45190039998851717

但是比 正则表达式快一点,除非你有一个非常长的字符串?

>>> print(timeit('import re'))
0.08660140004940331

(万一你已经在用了) ... 然后:

>>> print(timeit('text="1234"; import re; num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$"); re.match(num_format,text)'))
1.3882658999646083
>>> print(timeit('text="-4089175.25"; import re; num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$"); re.match(num_format,text)'))
1.4007637000177056
>>> print(timeit('text="-97271851234.28975232364"; import re; num_format = re.compile("^[\-]?[1-9][0-9]*\.?[0-9]+$"); re.match(num_format,text)'))
1.4191589000402018

没有一个接近最简单的 是小数,但是那当然不会捕捉到底片..。

>>> print(timeit('text="1234"; text.isdecimal()'))
0.04747540003154427

根据需要有选择总是好的吗?