如何用.isdigit键入负数?

时间:2015-02-02 14:17:45

标签: python

当我尝试这个时

if question.isdigit() is True:

我可以输入正确的数字,这会过滤掉字母/字母数字字符串

当我尝试's1'和's'时,它会转到(其他)。

问题是,当我输入负数如-1时,'。isdigit'计数' - '符号作为字符串值并拒绝它。我怎样才能使'.isdigit'允许否定符号' - '?

这是代码。我试过的东西。

while a <=10 + Z:
    question = input("What is " + str(n1) + str(op) + str(n2) + "?")
    a = a+1

    if question.lstrip("-").isdigit() is True:
        ans = ops[op](n1, n2)
        n1 = random.randint(1,9)
        n2 = random.randint(1,9)
        op = random.choice(list(ops))

        if int(question) is ans:
            count = count + 1
            Z = Z + 0
            print ("Well done")
        else:
            count = count + 0
            Z = Z + 0
            print ("WRONG")
    else:
        count = count + 0
        Z = Z + 1
        print ("Please type in the number")

6 个答案:

答案 0 :(得分:19)

使用lstrip

question.lstrip("-").isdigit()

示例:

>>>'-6'.lstrip('-')
'6'
>>>'-6'.lstrip('-').isdigit()
True

如果您想lstrip('+-')有效数字,可以+6

但我不会使用isdigit,您可以尝试int(question),如果该值无法表示为int,则会抛出异常:

try:
    int(question)
except ValueError:
    # not int

答案 1 :(得分:14)

使用try / except,如果我们无法转换为int,则会将is_dig设置为False

try:
    int(question)
    is_dig = True
except ValueError:
    is_dig = False
if is_dig:
  ......

或制作一个功能:

def is_digit(n):
    try:
        int(n)
        return True
    except ValueError:
        return  False

if is_digit(question):
   ....

在开始时查看你的编辑转换为int,检查输入是否为数字,然后转换是没有意义的,只需一步完成:

while a < 10: 
     try:
        question = int(input("What is {} {} {} ?".format(n1,op,n2)))
     except ValueError:
        print("Invalid input")
        continue # if we are here we ask user for input again

    ans = ops[op](n1, n2)
    n1 = random.randint(1,9)
    n2 = random.randint(1,9)
    op = random.choice(list(ops))

    if question ==  ans:
        print ("Well done")
    else:
        print("Wrong answer")
    a += 1

根本不确定Z在做什么,但Z = Z + 0Z完全没有做任何事情相同1 + 0 == 1

使用函数来获取输入我们可以使用范围:

def is_digit(n1,op,n2):
    while True:
        try:
            n = int(input("What is {} {} {} ?".format(n1,op,n2)))
            return n
        except ValueError:
            print("Invalid input")


for _ in range(a):
    question = is_digit(n1,op,n2) # will only return a value when we get legal input
    ans = ops[op](n1, n2)
    n1 = random.randint(1,9)
    n2 = random.randint(1,9)
    op = random.choice(list(ops))

    if question ==  ans:
        print ("Well done")
    else:
        print("Wrong answer")

答案 2 :(得分:1)

如果您不想去尝试...除外,您可以使用正则表达式

if re.match("[+-]?\d", question) is not None:
    question = int(question)
else:
    print "Not a valid number"

尝试...除外,它更简单:

try:
    question = int(question)
except ValueError:
    print "Not a valid number"

如果isdigit是必须的,你也需要保留原始值,你可以使用lstrip,如给出的答案中所述。另一个解决方案是:

if question[0]=="-":
    if question[1:].isdigit():
        print "Number"
else:
    if question.isdigit():
        print "Number"

答案 3 :(得分:0)

我在edabit上也有类似的问题,我意识到使用isnumeric()时,负数返回为False。我把我的解决方案放在下面: 创建一个接受字符串和整数列表的函数,然后过滤掉该列表,使其仅返回整数列表。

def filter_list(list):
    numbers = [i for i in list if str(i).isnumeric() == True]
    for i in list:
        try:
            int(i)
            if i <0:
                numbers.append(i)
        except ValueError:
            continue
    return numbers
list = [1,2,3,'a','b','c', -6, 0]
print(filter_list(list))

我还是Python的新手,所以这是一个基本尝试。随时告诉我是否有更简单或更美观的方式。

答案 4 :(得分:0)

要检查您的输入字符串是否为数字,即使您输入负值或浮点数,您也可以这样做:

if string.replace('.','').replace('-','').isnumeric():
    print(string + ' is a number')

如果你想特别检查你的字符串是否为负数,你可以这样做:

if string[0] == '-' and string[1:].replace('.','').isnumeric():
    print(string + ' is a negative number')

答案 5 :(得分:0)

我知道已经晚了,但我只是偶然发现了这个问题,我遇到了类似的问题,我就是这样解决的:

@staticmethod
    def getStringToFloatOrNone(value):
        if value == None:
            return None  
        if not str(value).replace(",","").replace(".","").replace("-","").strip().isdigit(): 
            return 0   
        return value if isinstance(value, float) or isinstance(value, int) else float(Helper.createViableFloatOrIntString(value))  

        return int(float(value)) if isinstance(value, float) or isinstance(value, int) else int(float(Helper.createViableFloatOrIntString(value))) 

只需替换所有公共分隔符并尝试它是否是数字。 如果是,则以浮点数形式获取实际值。