Verifier si la valeur saisie est un nombre en Python

Résolu
Lenouveauapprenti Messages postés 300 Date d'inscription samedi 22 décembre 2018 Statut Membre Dernière intervention 7 avril 2024 - Modifié le 1 févr. 2024 à 12:13
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 6 févr. 2024 à 19:06

Bonjour,

Environnement : Python 3.12

Niveau : Débutant

Je cherche à poser une condition pour vérifier si la valeur saisie est un nombre, sinon, un message sera renvoyé par Python

J'ai fait deux tentatives, sans succès.

1ère tentative :

if isinstance(Zone_Capital, (int, float)):
    Zone_IFiscal.focus_set()
else:
    messagebox.showerror(
        "Erreur de saisie",
        message="Veuillez saisir le Capital",
        parent=maFrame
    )
    Zone_Capital.focus_set()
return

2ème tentative :

if type(Zone_Capital) == 'float':
    Zone_IFiscal.focus_set()
else:
    messagebox.showerror(
        "Erreur de saisie",
        message="Veuillez saisir le Capital",
        parent=maFrame
    )
    Zone_Capital.focus_set()
return

Merci pour toute aide

1 réponse

Diablo76 Messages postés 161 Date d'inscription vendredi 25 novembre 2022 Statut Membre Dernière intervention 1 mai 2024 41
Modifié le 1 févr. 2024 à 02:47

Zone_Capital est ton objet Entry, il faut utiliser la méthode .get() qui elle retourne une chaine de charactères, il faut donc la convertir en int ou la comparer :

if isinstance(int(Zone_Capital.get()), int):
    ...

# ou
            
if Zone_Capital.get().isnumeric():
    ...

Edit: Prends l'habitude d'utiliser print() quand tu as des erreurs ou des conditions qui ne fonctionnent pas, si tu avais fait :

print(Zone_Capital)

Tu aurais compris ton erreur.

2
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 1 févr. 2024 à 12:20

Pour compléter cette réponse déjà proposée, j'écrirais plutôt ce qui suit (en renommant Zone_Capital en zone_capital pour respecter les conventions de nommage en python) :

saisie = zone_capital.get()
try:
    capital = float(saisie)
except ValueError:
    capital = None

if capital is None:
    print("Saisie invalide :", saisie)
else:
    print("Capital :", capital)

Bonne chance

2
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932 > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
2 févr. 2024 à 09:05

Bonjour

je sais que tu es partisan(e?) de "s'excuser plutôt que demander la permission", mais selon cet article de realpython.com LBYL vs EAFP: Preventing or Handling Errors in Python – Real Python

si la probabilité de l'erreur est grande, il est préférable de"regarder avant de sauter", et "s'excuser plutôt que demander la permission", si la probabilité est faible.

Évidement, il faut définir ce qui est grand et faible, mais je pense qu'un utilisateur qui tape n'importe quoi dans un champ texte ce n'est pas rare, du coup, il serait préférable de prendre la solution proposée par Diablo76

1
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024
5 févr. 2024 à 17:08

Hello, je n'ai pas très bien compris le sens du commentaire, dans la mesure où dans ma réponse, je récupère la valeur et vérifie qu'il s'agit bien un flottant. La différence réside essentiellement dans la manière dont ce test est écrit (try ... except au lieu de isinstance/get).

0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 932 > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
6 févr. 2024 à 15:43

ben justement, faire un try except, ce n'est pas tester si la string contient quelque chose qui représente un float avant de caster (ce que fait le code de diablo).

Tu castes en partant du principe que la string est bien formatée et si ça pète tu gères l'erreur.

Selon RealPython, en considérant que le mauvais formatage n'est pas rare, il est préférable de faire comme Diablo.

On pourrait faire en sorte que cette erreur devienne rare par des artifices dans le front (masques de saisie, validation de données etc..), mais je pense que lenouveauapprenti n'en est pas encore là

0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024
6 févr. 2024 à 19:06

Si la chaîne de caractère ne contient pas quelque chose qui peut être vu comme un flottant (même un flottant mal formaté), alors l'exception sera levée. Donc je ne comprends toujours pas ce qui te chagrine. Si tu préfères : le cast dans le try ... except marche si et seulement si la chaîne contient un flottant bien formaté.

0