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

Posted

技术标签:

【中文标题】如何检查字符串输入是不是为数字?【英文标题】:How to check if string input is a number?如何检查字符串输入是否为数字? 【发布时间】:2011-07-22 10:27:39 【问题描述】:

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

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) == 1int(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】:

如果您想计算浮点数,并且您想接受 NaNs 作为输入,但不接受像 '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

【讨论】:

以上是关于如何检查字符串输入是不是为数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 C++ 字符串是不是为 int?

JavaScript - 如何检查是不是在数字输入字段中输入了字母字符或符号[重复]

检查输入字符串是不是包含javascript中的数字

在将字符串转换为 int 之前检查字符串是不是不是数字 [重复]

Python/FLASK - html 表单返回字符串。如何检查它是不是包含数字?

c语言中如何检查输入值是不是为数字