IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Prise en compte du séparateur décimal système [QtCore]


Sujet :

PyQt Python

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut Prise en compte du séparateur décimal système
    Bonjour,

    Dans une interface graphique j'utilise des QlineEdit pour intéragir avec l'utilisateur.
    Comme les données à fournir sont des nombres j'avais utilisé la commande QDoubleValidator :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.T1_entree.setValidator(QDoubleValidator())
    Après un essai cela fonctionne bien sur un PC car le séparateur décimal du sysème est le point. Test sur un autre PC et là c'est le drame : le séparateur est la virgule, plus rien ne fonctionne.
    Le QDouble Validator n'empêche pas la prise en compte de la virgule sauf que cela plante le programme...

    Donc je repars vers la doc et je tombe sur setLocale(), puis decimalPoint(), format(), replace()....
    J'avoue qu'après plusieurs tentatives je ne m'en sors pas

    J'ai du louper un détail... Du coup j'aimerai savoir comment faire pour que mon QlineEdit puisse fonctionner quelque soit le séparateur sachant que je le convertis en float par la suite.

    (En gros voilà le code actuel - juste les lignes concernant un QlineEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.T1_entree.setValidator(QDoubleValidator())
    self.T1_entree.textChanged.connect(self.conversiondebit)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    t_finale=self.T1_entree.text()
    t_1=float(t_finale)+273.15
    Merci d'avance pour votre aide

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour à tous,

    Parce que la nuit porte conseille et que les recherches paient voici la solution trouvée ( https://www.developpez.net/forums/d1...ateur-decimal/):

    Formatage du QLine Edit et autorise la saisie d'un point ou d'une virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.qv0_entree.setValidator(QDoubleValidator().setLocale(QLocale(',')))
    Remplacement en cas de virgule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def conversiondebit(self,event):
     
            #recuperation des qlineedit
            p_initiale=self.P0_entree.text()
            p_finale=self.P1_entree.text()
            t_initiale=self.T0_entree.text()
            t_finale=self.T1_entree.text()
            deb_entree=self.qv0_entree.text()
     
            if '' in (p_initiale,p_finale,t_initiale,t_finale,deb_entree) : #si donnees entrees manquantes ne pas lancer le calcul
                pass
            else :
                champ_entree = [deb_entree,p_initiale,p_finale,t_initiale,t_finale]
     
                for i in range(0,len(champ_entree)):
     
                    if ","  in champ_entree[i] : #remplacement de la virgule si besoin
                        champ_entree[i]=champ_entree[i].replace(',','.')
     
     
                #conversion en float    
                p_0=float(champ_entree[1])*10**5
    Bon c'est un peu du bricolage mais ça fonctionne. Je ne trouve pas ma méthode super optimale par contre... surtout que j'ai beaucoup de Qlineedit dans l'application et je pense qu'il existe mieux pour autoriser la saisie de nombres avec virgule ou point et les convertir en float.
    Si jamais certains ont de meilleures méthodes je reste à l'écoute

  3. #3
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Il n'y a pas besoin de tester si le caractère est présent avant de faire un remplacment.

    Si tu as besoin d'effectuer cette opération à multiples reprises dans ton code, il serait ingénieux d'en faire une simple fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strdec_to_float = lambda s: float(s.replace(',', '.'))
    Et alors il n'y aurait plus qu'à l'utiliser sur ton itérable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champ_entree = [strdec_to_float(v) for v in (deb_entree, p_initiale, p_finale, t_initiale, t_finale)]
    Ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champ_entree = list(map(strdec_to_float, champ_entree))

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Pourquoi faire simple quand on peut faire compliquer !

    En effet je n'avais pas pris assez de recul pour envisager cela !
    Merci du conseil !

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour à toutes et à tous !

    Je me permets un nouveau post dans cette discussion résolue pour corriger un point.
    Je m'étais avancée un peu vite avec ma bidouille de solution pour accepter un point ou une virgule en séparateur décimal dans un Qlineedit.
    L'utilisation du setLocale me faisait perdre la fonction du QdoubleValidator, je pouvais entrer n'importe quel caractère dans le champ de saisie...

    Finalement j'ai une solution bien plus robuste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    format_valide = QRegExpValidator(QRegExp("[-+]?[0-9]*[\\,.]?[0-9]+([eE][-+]?[0-9]+)?"))
     
            self.T0_entree.setValidator(format_valide)
    On ne sait jamais si un jour cela peut servir à quelqu'un.

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/08/2016, 17h50
  2. Réponses: 1
    Dernier message: 13/07/2012, 17h04
  3. PROC FORMAT et nombre de décimales prises en compte
    Par nanou2183 dans le forum ODS et reporting
    Réponses: 6
    Dernier message: 08/06/2012, 15h05
  4. [AC-2003] Décimales non prises en compte.
    Par gentoo dans le forum IHM
    Réponses: 2
    Dernier message: 29/05/2010, 12h09
  5. Adresse IP non prise en compte par le système
    Par lesouriciergris dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 08/03/2007, 22h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo