0
votes

Instruction Else non exécutée avec une entrée string ou float

num1 = int(input("Enter the first integer: "))
num2 = int(input("Enter the second integer: "))  

if (str(num1).isdigit()) and (str(num2).isdigit()):
    if num1>num2:
        print(num2, num1)
    else:
        print(num1, num2)
else:
    print("That is not an integer!")
Error that I am getting:Traceback (most recent call last):File "C:\Users\shrad.spyder-py3\temp.py", line 183, in 
num2 = int(input("Enter the second integer: "))ValueError: invalid literal for int() with base 10: '2.2'

2 commentaires

2.2 est un float, pas un int, mais vous essayez de le convertir en un int.


Votre code fonctionne parfaitement dans mon éditeur pycharm. supprimez simplement l'int et écrivez num1 = input ("Entrez le premier entier:").


4 Réponses :


0
votes

2.2 est un float , pas un int , mais vous essayez de le convertir en un int .


0 commentaires

1
votes

Vous essayez de convertir en un entier avant d'avoir testé s'il se compose de chiffres. Attendez d'avoir effectué ce test avant de procéder à la conversion.

num1 = input("Enter the first integer: ")  # keep it as a string for now
num2 = input("Enter the second integer: ")

if num1.isdigit() and num2.isdigit():
    num1 = int(num1)  # NOW convert to int
    num2 = int(num2)
    if num1>num2:
        print(num2, num1)
    else:
        print(num1, num2)
else:
    print("That is not an integer!")

Au fait, sachez que votre test isdigit ne fonctionnera pas pour les entiers négatifs.


0 commentaires

1
votes

int() n'acceptera qu'un entier - c'est-à-dire un nombre sans point décimal, c'est pourquoi il n'acceptera pas 2.2. Vous voudrez probablement utiliser float ().


0 commentaires

0
votes

Eh bien, vous savez ce qu'ils disent, «ne faites jamais confiance à l'entrée de l'utilisateur». Même si l'utilisateur est, eh bien, vous-même.

L'instruction: input("Enter the first integer: ") renvoie une chaîne (celle que vous avez tapée), qui, à son tour, transmise à int() est tentée d'être convertie en entier.

C'est une exigence de la fonction int, lorsqu'on lui donne une chaîne en entrée, que cette chaîne soit strictement une représentation d'un entier (et non un nombre à virgule flottante, comme, disons, 2.2)

Vous pouvez expérimenter avec la toute première ligne: num1 = int(input("Enter the first integer: ")) puis print(num1) pour comprendre comment cela fonctionne pour vous-même; quand il soulève et quand non.

Le problème dans le code que vous avez publié est que vous essayez d'abord de convertir en un int, puis de vérifier ultérieurement si l'entrée était en fait un int. Ainsi, l'interpréteur Python devait d'abord faire face au problème et utiliser son propre moyen automatique de le signaler: une exception.

Un moyen de contourner ce problème pourrait être de reporter la conversion string -> int jusqu'à ce qu'elle soit réellement nécessaire. Heureusement, ce n'est qu'un seul endroit, dans la comparaison, qui deviendrait alors: if int(num1) > int(num2): Cela vous éviterait les problèmes liés aux conversions int () au début, plus les conversions retour à la chaîne pour la vérification int ( if (str(num1).isdigit()) and (str(num2).isdigit()): pourrait simplement devenir if num1.isdigit() and num2.isdigit(): depuis num1, num2 n'a pas encore été dissimulé.)

Alternativement, si vous voulez que les nombres décimaux soient convertis sans erreur, vous pouvez utiliser la fonction float() (qui peut aussi bien convertir un int).

Vous pouvez également essayer d'utiliser la gestion des exceptions, comme:

try:
    num1 = int(input("Enter the first integer: "))
    num2 = int(input("Enter the second integer: "))
except Exception as e:
    print("Error converting input to integers", e)

ce qui vous éviterait à son tour d'avoir à valider l'entrée ci-dessous ...


0 commentaires