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

How can I check if string input is a number?

提问人:Trufa 提问时间:3/25/2011 最后编辑:Peter MortensenTrufa 更新时间:1/31/2023 访问量:849782

问:

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

user_input = input("Enter something:")

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

以上方法不起作用,因为总是返回一个字符串。input

Python 输入 类型

评论

0赞 Trufa 3/25/2011
我不知道在“input always returns strings”中,“returns”是否正确。
0赞 Daniel DiPaolo 3/25/2011
看起来您使用的是 Python 3.x,在这种情况下,yes 始终返回字符串。请参见:docs.python.org/release/3.1.3/library/functions.html#inputinput
0赞 Trufa 3/25/2011
@DanielDiPaolo:哦,是的,我知道这一点,因此有问题,我只是不知道返回这个词是否正确。
1赞 Daniel DiPaolo 3/25/2011
啊,那么是的,“回报”一词恰恰是正确的术语!
1赞 R__raki__ 2/3/2016
@Trufa这可能会起作用。if type(eval(user_input)) == int:

答:

305赞 Daniel DiPaolo 3/25/2011 #1

只需尝试将其转换为 int,如果它不起作用,则将其保释。

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

请参阅官方教程中的处理异常

评论

1赞 maxkoryukov 6/6/2017
如果只想要整数值,而不需要浮点数,请使用val = int(str(userInput))
0赞 Loïc Faure-Lacroix 4/24/2021
这也不适用于布尔值 as 和int(True) == 1int(False) == 0
111赞 jmichalicek 3/25/2011 #2

显然,这不适用于负值,但适用于正数。

isdigit()

if userinput.isdigit():
    #do stuff

评论

61赞 BatchyX 3/25/2011
“-1”.isdigit() == 假
1赞 jmichalicek 1/9/2014
我不这么认为,洛皮斯。当我给出这个答案时,我有点跳枪回答问题,然后我知道足够多。我会和 Daniel DiPaolo 对 int 的回答一样,但使用 float() 而不是 int()。
1赞 Carl H 4/14/2015
负数和浮点数返回 false,因为 '-' 和 '.' 不是数字。isdigit() 函数检查字符串中的每个字符是否在“0”和“9”之间。
2赞 Dave Rove 7/16/2020
使用 not 是因为是一种不安全的测试,它将 unicode power-of-2、² 等字符识别为无法转换为整数的数字。isdecimalisdigitisdigit
26赞 RazorX 1/6/2012 #3

对于 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 
3赞 Antoni Gual Via 1/22/2013 #4

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

import fractions

def isnumber(s):
   try:
     float(s)
     return True
   except ValueError:
     try: 
       Fraction(s)
       return True
     except ValueError: 
       return False
6赞 user2196332 3/22/2013 #5

检查输入是否正常 特定范围内的正整数 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)
12赞 karthik27 12/9/2013 #6

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

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"

您也可以根据具体要求更改格式。 我看到这篇文章有点太晚了,但希望这对其他正在寻找答案的人有所帮助:)。如果给定的代码中有任何错误,请告诉我。

评论

0赞 Brian Bruggeman 5/29/2015
这将检查字符串中是否有数字(float、int 等)。但是,如果不仅仅是数字,它仍将返回结果。例如:“1.2 Gbps”将返回误报。这可能对某些人有用,也可能没有用。
1赞 Brian Bruggeman 8/24/2015
另请注意:对于现在正在寻找的任何人,我的原始评论不再有效。:P感谢您的更新@karthik27!
5赞 rachit_verma 2/22/2014 #7

@karthik27,对于负数,我建议这样做

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

然后用那个正则表达式做任何你想做的事情,match(),findall()等

评论

0赞 Jadi 12/25/2015
好主意。干净实用。虽然它需要针对特定情况进行一些更改,但目前也与 3.4.5 匹配
0赞 skvalen 7/19/2017
为什么不只是:num_format = re.compile(r'^\-?[1-9]+\.?[0-9]*')
0赞 Giri Annamalai M 11/12/2018
相反,只需转换为浮点数即可
0赞 John Worrall 9/11/2014 #8

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

这是最终让我无法得到我想要的答案的解决方案:

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”或任何其他非整数字符。最好将其作为原始输入,检查原始输入是否可以转换为整数,然后再进行转换。

评论

0赞 Holloway 9/11/2014
通常,最好只捕获正在处理的异常。在这种情况下,它将是 .ValueError
0赞 John Worrall 9/14/2014
谢谢你的提示!我已经编辑了解决方案以包含该反馈。这是我的第一个 SO 解决方案!
1赞 ReadyToHelp 10/19/2014 #9

我知道这已经很晚了,但它可以帮助其他不得不花 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赞 Joooeey 5/18/2017
如果您输入 ,则不起作用,这是 OP 特别提到的示例之一。0
58赞 Andrés Fernández 9/6/2015 #10

isnumeric() 方法将完成这项工作:

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

但请记住:

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

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

所以不接受负数。

评论

1赞 perlyking 2/14/2017
值得注意的是,在 Python 2.7 中,这仅适用于 unicode 字符串。非 unicode 字符串 () 产生 ,而"123456".isnumeric()AttributeError: 'str' object has no attribute 'isnumeric'U"12345".numeric() = True
2赞 Artyer 7/18/2017
此外,在某些边缘情况下,这不起作用。拿。 为 True,但引发 ValueError。a = '\U0001f10a'a.isnumeric()int(a)
10赞 Deqing 1/23/2018
'3.3'.isnumeric()False
-4赞 sachkh 10/20/2015 #11
a=10

isinstance(a,int)  #True

b='abc'

isinstance(b,int)  #False
1赞 Jesse Downing 11/12/2015 #12

这是一个简单的函数,用于检查 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

评论

1赞 Dietrich Epp 11/12/2015
欢迎来到 Stack Overflow!这是一个老问题,公认的答案似乎相当不错。你确定你有新的东西要添加吗?
1赞 Jesse Downing 11/12/2015
我认为这是一个轻微的改进:在避免嵌套的 if-else 的同时效率同样低。我是新来的,如果答案伤害了社区,如果它被删除,也不会感到难过。
-1赞 Akshay Sahai 1/7/2016 #13

这是最简单的解决方案:

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

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

评论

1赞 Nelewout 1/7/2016
SyntaxError: 'return' outside function.此外,永远不会评估为 .a is intTrue
0赞 Akshay Sahai 1/7/2016
感谢@N.Wouda的帮助,我已经进行了更改,检查这个
1赞 Nelewout 1/7/2016
你确定你的答案实际上对这个问题有新的贡献吗?
1赞 Nelewout 1/7/2016
这是非常值得称赞的,不要误会我的意思。但是这个特定的问题似乎已经被其他答案很好地涵盖了,因此回答尚未得到良好答案的问题可能会更有成效!
2赞 nevelis 9/14/2016
如果 'a' 是一个字符串,int(a) 会抛出一个异常,并且永远不会调用 'else' 分支。在 python 2 和 3 中测试。
5赞 José Crespo Barrios 8/30/2016 #14

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

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

评论

1赞 Martin Tournoij 12/16/2016
如果转换未失败,这将返回 ,而不是 。floatbool
0赞 José Crespo Barrios 3/1/2017
谢谢 Carpetsmoker,你是对的:)固定!
-2赞 Sibi Jayan 3/4/2017 #15

这是基于答案的灵感。我定义了一个函数,如下所示。看起来它工作正常。

def isanumber(inp):
    try:
        val = int(inp)
        return True
    except ValueError:
        try:
            val = float(inp)
            return True
        except ValueError:
            return False
0赞 Nima Sajedi 3/13/2017 #16
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.
>>> 
1赞 ryanjdillon 3/14/2017 #17

如果你想计算浮点数,并且你想接受 s 作为输入,而不是其他字符串,比如 ,你可以执行以下操作:NaN'abc'

def isnumber(x):
    import numpy
    try:
        return type(numpy.float(x)) == float
    except ValueError:
        return False
3赞 Raj Shah 4/6/2017 #18

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

    user_input = input("Enter something:")
    if user_input.isdigit():
        print("Is a number")
    else:
        print("Not a number")
9赞 Woody 4/12/2017 #19

如果你特别需要一个 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))

如果您只需要使用 ints,那么我见过的最优雅的解决方案是“.isdigit()”方法:

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

print('You entered {}'.format(a))
1赞 Anton vBR 10/18/2017 #20

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

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)
2赞 SPYBUG96 11/14/2017 #21

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

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: 

评论

4赞 fwip 9/23/2019
这仅有效,因为此处的数字是数字类型。输入“8”(键入 str)将为“Not A Number”。
5赞 Luis Sieira 12/21/2017 #22

自然: [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

评论

2赞 Luis Sieira 1/13/2018
如果你不介意的话,我想知道这个答案有什么问题。也许有更好的方法来执行我愿意知道的任务
0赞 Mavaddat Javid 5/9/2021
这没有错。人们只是不理解你所说的条件。
4赞 Salam 2/11/2018 #23

此解决方案将只接受整数,而只接受整数。

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: "))
0赞 Emman Lopez Telewik 5/4/2018 #24

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

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)))
0赞 Alan Bagel 4/17/2021 #25

这将起作用:

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()
-1赞 Technicals mirchis 6/3/2021 #26

您可以键入:

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!")
-1赞 AidinZadeh 8/11/2021 #27

检查类型:Decimal

import decimal
isinstance(x, decimal.Decimal)
0赞 yurenchen 5/24/2022 #28

我认为在一行中不做一件简单的事情不是 Pythonic。

没有 的版本,使用正则表达式匹配: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
0赞 JeopardyTempest 7/21/2022 #29

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

看起来它仍然比 try/exceptions 方法慢得多,但如果您不想弄乱这些,那么在大量使用时,某些用例可能会比正则表达式更好,特别是如果某些数字是短/非负数:

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

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

0赞 tonysepia 12/29/2022 #30

我发现一些 Python 库使用断言来确保程序员用户提供的值是一个数字。

有时,看到一个“来自野外”的例子是件好事。用/:assertisinstance

def check_port(port):
    assert isinstance(port, int), 'PORT is not a number'
    assert port >= 0, 'PORT < 0 ({0})'.format(port)