2016-06-15 2 views
-1

Je veux vérifier si l'entrée est un nombre (float avec 0, un ou deux décimales) et supérieur à 0Vérifier entrée nombre décimal

def getnumber(): 
    print ("write a number: \n") 
    isValid = False 
    while not isValid: 
     try: 
      number = float(raw_input().replace(",",".")) 
      if number >= 0: 
       isValid=True 
      else: 
       print ("Number not valid") 
       isValid = False 
       getnumber() 
     except: 
      print ("Number not valid") 
    return number 

je les problèmes suivants:

1- Je ne sais pas comment vérifier s'il n'y a que deux décimales

2- le code ne renvoie pas le numéro si je présente d'abord un nombre négatif

est-ce que quelqu'un sait comment y remédier?

Merci beaucoup

+0

Vous pouvez toujours vérifier la chaîne pour voir s'il y a un seul '.' et 2 caractères après la période. – nbryans

+1

Je ne sais pas pourquoi vous remplacez les virgules par des virgules décimales. – holdenweb

+0

dang, pourquoi tant de personnes utilisent une boucle while ** et récursion ** pour obtenir des entrées? supprimer l'appel à 'getnumber()' à l'intérieur de la fonction résoudra # 2. –

Répondre

1

La raison pour laquelle votre code ne fonctionne pas avec des nombres négatifs est parce que la fonction elle-même appelle de manière récursive lorsque le nombre est négatif, mais la valeur de isValid est toujours faux après cet appel, de sorte que le répétitions de boucle.

Il n'y a pas vraiment besoin de la variable booléenne.

Cela vous laisse le problème de la détection de deux décimales. Pour pouvoir faire cela au niveau de la chaîne, vous devez conserver la chaîne que vous avez convertie en un nombre à virgule flottante. Supposons que vous le stockiez comme s vous pourriez utiliser un test comme len(s) > 3 et s [-3] == '.'` pour le vérifier.

Cela vous donne une solution comme:

def getnumber(): 
    while True: 
     try: 
      s = raw_input("Write a number:").replace(",",".") 
      number = float(s) 
      if number >= 0 and len(s) > 3 and s[-3] ==".": 
       return number 
      else: 
       print("Negative or not two decimal places") 
     except Exception: 
      print("Invalid number") 

print(getnumber()) 
+0

Et bien sûr vous pourriez diviser le test si vous vouliez des messages d'erreur différents pour les nombres négatifs et le mauvais nombre de places. – holdenweb

+0

Génial. Merci beaucoup. Cela fonctionne parfaitement :) – Jessica

+0

Mais pourquoi utiliser un 'try ... except' du tout? Cela n'apporte rien à la détection de numéro invalide et peut masquer d'autres exceptions qui devraient être traitées explicitement à la place. – zezollo