2015-02-02 16 views
9

gdy próbuję toJak wpisać liczbę ujemną przy pomocy .isdigit?

if question.isdigit() is True: 

mogę wpisywania liczb w porządku, a to odfiltrować alfa/ciągi alfanumeryczne

gdy próbuję „s1” i „s” na przykład, to udać się do (jeszcze).

Problem polega na tym, że gdy wstawiam liczbę ujemną, taką jak -1, ".isdigit" zlicza znak "-" jako wartość ciągu i odrzuca go. Jak mogę to zrobić, aby ".isdigit" zezwalał na negatywny symbol "-"?

Oto kod. O tym, co próbowałem.

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

Proszę podać 1) wejście sampel, 2) dane wyjściowe dla każdej wartości wejściowej. –

Odpowiedz

9

Użyj spróbuj/z wyjątkiem, jeśli nie możemy rzucać się int będzie ustawiony is_dig do False:

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

lub dokonać funkcję:

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

if is_digit(question): 
    .... 

Patrząc na swojej edycji obsadzie int na początku, sprawdzając, czy wejście jest cyfrą, a następnie rzucając ma sensu, zrób to w jednym kroku:

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 

Nie wiesz co Z robi w ogóle, ale Z = Z + 0 jest taka sama jak nie robi nic Z wcale 1 + 0 == 1

Korzystanie z funkcji wziąć wejście możemy po prostu użyć zakres:

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") 
11

Zastosowanie lstrip:

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

Przykład:

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

Można lstrip('+-') jeśli rozważyć +6 ważny cyfrowy.

Ale nie użyłby isdigit, można spróbować int(question), będzie to wyjątek, jeżeli wartość nie może być reprezentowana jako int:

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

spróbuj ... z wyjątkiem trwa długo –

+0

co to robi? – Wdoctor123

+1

@no_name nie warto myśleć o tym czasie .. – Maroun

1

Jeśli nie w ish, aby przejść do try ... except, można użyć wyrażenia regularnego

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

Z try ... except, jest prostszy:

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

Jeśli isdigit jest koniecznością i trzeba zachować Oryginalna wartość również, możesz użyć lstrip jak wspomniano w odpowiedzi udzielonej. Inne rozwiązanie to:

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