Verifier si la valeur saisie est un nombre en Python

Résolu
Lenouveauapprenti Messages postés 306 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33725 Date d'inscription   Statut Modérateur Dernière intervention   - 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

A voir également:

1 réponse

Diablo76 Messages postés 221 Date d'inscription   Statut Membre Dernière intervention   64
 

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 33725 Date d'inscription   Statut Modérateur Dernière intervention   7 867
 

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
Utilisateur anonyme > mamiemando Messages postés 33725 Date d'inscription   Statut Modérateur Dernière intervention  
 

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 33725 Date d'inscription   Statut Modérateur Dernière intervention   7 867 > Utilisateur anonyme
 

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
Utilisateur anonyme > mamiemando Messages postés 33725 Date d'inscription   Statut Modérateur Dernière intervention  
 

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 33725 Date d'inscription   Statut Modérateur Dernière intervention   7 867 > Utilisateur anonyme
 

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