在通过 int() 传递字符串之前,如何检查字符串是否为负数?

How do I check if a string is a negative number before passing it through int()?

提问人:Jim Prideaux 提问时间:5/27/2016 更新时间:6/18/2023 访问量:23859

问:

我正在尝试编写一些东西来检查字符串是数字还是负数。如果它是一个数字(正数或负数),它将通过 int() 传递。不幸的是,当包含“-”时,isdigit() 不会将其识别为数字。

这是我到目前为止所拥有的:

def contestTest():
# Neutral point for struggle/tug of war/contest
x = 0

while -5 < x < 5:
    print "Type desired amount of damage."
    print x
    choice = raw_input("> ")

    if choice.isdigit():
        y = int(choice)
        x += y
    else:
        print "Invalid input."

if -5 >= x:
    print "x is low. Loss."
    print x
elif 5 <= x:
    print "x is high. Win."
    print x
else:
    print "Something went wrong."
    print x

我能想到的唯一解决方案是一些单独的、复杂的一系列语句,我可能会在一个单独的函数中将它们松鼠掉,以使其看起来更好。我将不胜感激任何帮助!

python-2.7 英语

评论

0赞 Charlie Parker 11/27/2021
有什么问题: kite.com/python/answers/....

答:

10赞 Alex Hall 5/27/2016 #1

您可以先轻松地从左侧删除字符,如下所示:

choice.lstrip('-+').isdigit()

但是,最好改为处理无效输入的异常:

print x
while True:
    choice = raw_input("> ")
    try:
        y = int(choice)
        break
    except ValueError:
        print "Invalid input."
x += y
1赞 syntonym 5/27/2016 #2

与其检查是否可以将输入转换为数字,不如尝试转换,如果失败,请执行其他操作:

choice = raw_input("> ")

try:
    y = int(choice)
    x += y
except ValueError:
    print "Invalid input."
1赞 robotHamster 5/27/2016 #3

您可以通过使用 来解决此问题。float 如果不是数字,则应返回 ValueError。如果你只处理整数,你可以使用float(str)int(str)

所以与其做

if choise.isdigit():
   #operation
else:
   #operation

你可以试试

try:
    x = float(raw_input)
except ValueError:
    print ("What you entered is not a number")

请随意替换为 ,并告诉我它是否有效!我自己还没有测试过。floatint

编辑:我刚刚在Python的文档(2.7.11)上也看到了这个

0赞 Charlie Parker 11/27/2021 #4

这不是更简单吗?

def is_negative_int(value: str) -> bool:
    """
    ref:
        - https://www.kite.com/python/answers/how-to-check-if-a-string-represents-an-integer-in-python#:~:text=To%20check%20for%20positive%20integers,rest%20must%20represent%20an%20integer.
        - https://stackoverflow.com/questions/37472361/how-do-i-check-if-a-string-is-a-negative-number-before-passing-it-through-int
    """
    if value == "":
        return False
    is_positive_integer: bool = value.isdigit()
    if is_positive_integer:
        return True
    else:
        is_negative_integer: bool = value.startswith("-") and value[1:].isdigit()
        is_integer: bool = is_positive_integer or is_negative_integer
        return is_integer
0赞 J Z 6/18/2023 #5

如果您只想要整数并拒绝十进制数。您可以使用以下函数进行检查。

def isInteger(string):
  if string[0] == '-': #if a negative number
    return string[1:].isdigit()
  else:
    return string.isdigit()

0赞 Miguel Garcia 6/18/2023 #6

在尝试任何强制转换之前,您可以使用正则表达式来检查字符串是否具有整数模式:

import re
patternInteger = re.compile("^[+-]?[0-9]+$")

if patternInteger.match(string):
    return int(string)
else:
    return "This string is not an integer number"

您可以泛化正则表达式模式以匹配其他类型的字符串,这些字符串可能看起来像浮点数甚至复数。在这种情况下,正则表达式可能有点矫枉过正,但如果将来您必须处理更通用的模式来识别,那么学习正则表达式可能非常有用。