当我尝试这个时
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")
答案 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 + 0
与Z
完全没有做任何事情相同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)))
只需替换所有公共分隔符并尝试它是否是数字。 如果是,则以浮点数形式获取实际值。