【问题标题】: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: 这可能有效。

标签: python input types


【解决方案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
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2022-06-17
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多