2014-05-08 5 views
1

J'ai étudié cette question ici J'ai trouvé une question similaire mais différente. Je dois valider l'entrée de l'utilisateur dans le morceau de code sur lequel je travaille pour imprimer une erreur si l'entrée de l'utilisateur est inférieure à 0 (cela fonctionne correctement) et imprimer une erreur si l'entrée est non-numérique. les problèmes sont. Si j'utilise l'entrée plutôt que raw_input je reçois une erreur:Entrées et validation des entrées utilisateur

NameError name 'Whatever I type in' is not defined 

Ce que j'essayé jusqu'à présent:

coulée la variable comme un entier et avons essayé d'utiliser la fonction isNaN mais qui a lamentablement échoué et enfin faire le tour du problème en utilisant ifs et elses. c'est le code qui fonctionne jusqu'ici.

def pints_to_litres(): 
    pints = 0 
    pints = input("Please enter the amount of Imperial Pints you would like converted into Litres >>>") 
    litres = pints * float(0.568261) 
    litres = "%.2f" % litres 
    print (""+str(pints)+ " Pint(s) is equal to " +str(litres)+ " Litre(s)") 
    if (pints < 0): 
     print("Invalid Input! Try Again") 
     pints_to_litres() 

Merci les gars à l'avance Peter Romaniuk

+0

Je ne sais pas pourquoi le modifier, ce code est en Python. – user3578634

+1

pourquoi n'utilisez-vous pas 'raw_input'? – honi

+0

Je reçois toujours des erreurs avec raw_input "TypeError: impossible de multiplier la séquence par un non-int de type 'float'" – user3578634

Répondre

3

ici, j'amélioré votre code:

def pints_to_litres(): 
    over = False 
    while not over: 
     try: 
      pints = int(raw_input("Please enter the amount of Imperial Pints you would like converted into Litres >>>")) 
      litres = pints * float(0.568261) 
      print (""+str(pints)+ " Pint(s) is equal to " +str(litres)+ " Litre(s)") 
      if (pints < 0): 
       print("Invalid Input! Try Again") 
      else: 
       over = True 
     except ValueError: 
      print("Invalid Input! Try Again") 
  • paramètre inutile de pints avant de l'écraser avec raw_input;
  • changé l'utilisation de input en faveur de raw_input conçu à cet effet;
  • si la chaîne n'est pas valide, elle renvoie ValueError au moment de la conversion int() de pints et de boucles à nouveau;
  • si la valeur est trop faible, il boucle à nouveau;
  • Comme vous pouvez le voir, j'ai également changé votre appel récursif à la fonction, comme si l'utilisateur échouait toujours, vous finissez par écraser la limite de la pile des fonctions, et avez un échec.
+1

Merci! Ceci est parfait et fonctionne parfaitement, le meilleur de tous, je peux maintenant voir où je me suis trompé alors Merci beaucoup :) – user3578634

+0

LOL. Comme une réponse va une fois, "Qui ne parviendrait pas à taper un nombre 999999 fois?" "Qui sait? Peut-être que vous le ferez. "BTW, cette erreur est appelée RuntimeError. – thecoder16

+0

ce n'est pas parce qu'il est peu probable que ça n'arrive pas ** ça n'arrive pas!Vous ne savez jamais comment vous utiliserez un code dans le futur, et vous devriez toujours le faire fonctionner du mieux possible! – zmo

1
pints = raw_input("Please enter the amount of Imperial Pints you would like converted into Litres >>>") 
try: 
    pints = float(pints) 
except ValueError: 
    print("Invalid Input! Try Again") 
    pints_to_litres() 

puis continuer avec le code

+0

c'est une mauvaise programmation pour se recurder sur une fonction, sans faire une récursion correcte. – zmo

+1

convenu. ta réponse est bien meilleure. Je faisais le moins de changement possible au code de l'op – honi

+1

Merci pour votre aide honi J'ai réussi à le réparer avec le correctif de @zmo. Merci d'essayer de m'aider, je l'apprécie grandement :) – user3578634

1

essayez ceci:

try: 
    pints = float(raw_input("Please enter the amount of Imperial Pints you would like converted into Litres >>>\n")) 
    # Calculation ... 
except ValueError: 
    print "Error" 
+0

Merci josip_grg Il a maintenant été corrigé. Merci de votre aide. En tant que débutant, toute aide est à la fois utile et m'apprend quelque chose. – user3578634

0

vous pouvez vérifier si l'entrée est un chiffre bu à l'aide .isdigit() essayer

entry =raw_input("Please enter the amount of Imperial Pints you would like converted into Litres >>>") 
     if (not(entry.isdigit())): 
       print "not a number" 
       pints_to_litres() 
     else: 
       pints=(int)(entry) 
Questions connexes