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

Python Discussion :

print => imposer le nombre de digits sur un float


Sujet :

Python

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut print => imposer le nombre de digits sur un float
    Bonjour

    Je voudrais dans un print imposer le nombre de digits utilisé pour l'affichage d'un float.

    Voice où j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print("    : {}".format(tab[hauteur][largeur]))
                    print("5.2 : {:5.2f}".format(tab[hauteur][largeur]))
                    print("5   : {:5f}".format(tab[hauteur][largeur]))
                    print(" .2 : {:.2f}".format(tab[hauteur][largeur]))
    Voici ce que ça affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        : 62.269874
    5.2 : 62.27
    5   : 62.269874
     .2 : 62.27
    J'aurais aimé que la ligne avec le :5f me donne 5 digits d'affichage. La ligne avec le :5.2f les impose bien. Par analogie au C, j'ai aussi essayé {:5.f}, mais, là python ne passe pas...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je crois pas qu'on puisse directement avec le formatage des nombres flottants comme ça, la partie entière et la partie décimale sont distinctes.
    sinon la filouterie qu'on peut faire c'est passer le tout à un second .format() en lui précisant un nombre de caractères pour la chaine à afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> for i in (62.269874, 143.5, 1.1864354683434538, 9845):
    >>>    print("pouet {:10s} coincoin".format("{:3.3f}".format(i)))
    pouet 62.270     coincoin
    pouet 143.500    coincoin
    pouet 1.186      coincoin
    pouet 9845.000   coincoin
    mais là encore si ça dépasse, ça dépasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>>    print("pouet {:5s} coincoin".format("{:3.3f}".format(i)))
    pouet 62.270 coincoin
    pouet 143.500 coincoin
    pouet 1.186 coincoin
    pouet 9845.000 coincoin
    donc si c'est pour faire de l'alignement mieux vaudra prévoir suffisament large.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Pour fabriquer une chaine de caractère à partir d'un float à zéro décimale {:5.0f} le fait.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Mon nombre de décimale est inconnu...

    Donc, si la largeur de l'affichage souhaité est lar_aff, je peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                    if int(tab[hauteur][largeur])==tab[hauteur][largeur] : # éviter un problème avec les puissances de 10
                        dec=int(log(abs(tab[hauteur][largeur])+.1)/log(10))
                    else :
                        dec=int(log(abs(tab[hauteur][largeur]))/log(10))
                    if tab[hauteur][largeur]<0 :
                        dec+=1
                    if lar_aff-dec>2 :
                        ch='0:^.{}f'.format(lar_aff-dec-2)
                        ch='{'+ch+'}'
                        print(ch.format(tab[hauteur][largeur]),end="")
                    elif col_lar[largeur]-dec==2 :
                        print('{0:.0f}'.format(tab[hauteur][largeur]),end=".")
                    else :
                        print('{0:.0f}'.format(tab[hauteur][largeur]),end="")
    Avec ceci, j'ai le même comportement quand un code en C : dépassement uniquement si la partie décimale est trop grande.

    Voici le code complet que je teste :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    def aff_tab(tab,larg) :
        X=len(tab[0])
        Y=len(tab)
        col_lar=[]
     
     
        for largeur in range(X) :
            A=larg
            for hauteur in range(Y) :
                if   isinstance(tab[hauteur][largeur], str) :
                    A=max(A,len(tab[hauteur][largeur]))
            col_lar.append(A)
     
     
     
        print("")
        print("+",end="")
        for largeur in range(X) :
            for cases_lar in range(col_lar[largeur]+2) :
                print("-",end="")
            print("+",end="")
        print("");
        for hauteur in range(Y) :
            print("| ",end="")
            for largeur in range(X) :
                if   isinstance(tab[hauteur][largeur], float) :
                    if int(tab[hauteur][largeur])==tab[hauteur][largeur] : # éviter un problème avec les puissances de 10
                        dec=int(log(abs(tab[hauteur][largeur])+.1)/log(10))
                    else :
                        dec=int(log(abs(tab[hauteur][largeur]))/log(10))
                    if tab[hauteur][largeur]<0 :
                        dec+=1
                    if col_lar[largeur]-dec>2 :
                        ch='0:^.{}f'.format(col_lar[largeur]-dec-2)
                        ch='{'+ch+'}'
                        print(ch.format(tab[hauteur][largeur]),end="")
                    elif col_lar[largeur]-dec==2 :
                        print('{0:.0f}'.format(tab[hauteur][largeur]),end=".")
                    else :
                        print('{0:.0f}'.format(tab[hauteur][largeur]),end="")
                elif isinstance(tab[hauteur][largeur], int  ) :
                    ch='0:^{}d'.format(col_lar[largeur])
                    ch='{'+ch+'}'
                    print(ch.format(tab[hauteur][largeur]),end="")
                elif isinstance(tab[hauteur][largeur], str  ) :
                    ch='0:^{}'.format(col_lar[largeur])
                    ch='{'+ch+'}'
                    print(ch.format(tab[hauteur][largeur]),end="")
     
                print(" | ",end="")
            print("")
            print("+",end="")
            for largeur in range(X) :
                for cases_lar in range(col_lar[largeur]+2) :
                    print("-",end="")
                print("+",end="")
            print("")
     
     
    tab=[["addfdfsv",62.269874,1000.0,100.0],[465.987456324,5654.69,654.98,0.12345],[-23.354789,-123.456,-1234.456,-100]]
    aff_tab(tab,4)
    L'affichage est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +----------+------+------+------+
    | addfdfsv | 62.3 | 1000 | 100. | 
    +----------+------+------+------+
    | 465.9875 | 5655 | 655. | 0.12 | 
    +----------+------+------+------+
    | -23.3548 | -123 | -1234 | -100 | 
    +----------+------+------+------+
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je viens de penser à une autre méthode, moins mathématique, juste du traitement de chaîne de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                    ch='0:^{}'.format(lar_aff)
                    ch='{'+ch+'}'
                    ch=ch.format(tab[hauteur][largeur])
                    if len(ch)>lar_aff :
                        a=ch.split(".",1)
                        if len(a[0])>=col_lar[largeur] :
                            print(a[0],end="")
                        else :
                            print(ch[0:col_lar[largeur]],end="")
                    else :
                        print(ch,end="")
    Je la trouve plus courte et sûrement plus rapide à exécuter car il n'y a pas de calcul de logarithme.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par troumad Voir le message
    Mon nombre de décimale est inconnu...
    Le nombre flottants servent essentiellement à faire des calculs. Vu l'imprécision due à leur représentation binaire, le nombre de décimales (liée quelque part à la précision des calculs) ne peut pas être inconnue.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    On parlera de chiffres significatifs alors. Mais, combien y en a t-il avant la virgule ? C'est là le mystère.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par troumad Voir le message
    On parlera de chiffres significatifs alors. Mais, combien y en a t-il avant la virgule ? C'est là le mystère.
    Je ne vois pas où est le mystère. Si on calcule une grandeur, on sait à priori quelle est sera l'ordre de grandeur du résultat (la puissance de 10 qui va avec donner le nombre de chiffres significatifs).

    "à priori" parce que si on se retrouve un ou deux ordres de grandeur de différence avec ce qui est attendu, c'est qu'on s'est planté quelque part. Et quitte à afficher quelque chose qui sera tronqué un peu n'importe comment autant afficher des "*****" plus facile à détecter pour voir que çà cloche.

    La notation scientifique est peut être plus "homogène": on a toujours un chiffre avant la virgule.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Le but était aussi de faire quelque chose de général qui marche dans tous les cas.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

Discussions similaires

  1. Comment imposer le nombre de digit derrière la virgule
    Par bourgui78 dans le forum Général Python
    Réponses: 1
    Dernier message: 02/12/2008, 10h38
  2. nombres d'images sur une lign automatique
    Par AnKhCHFR dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/03/2005, 11h52
  3. incidence nombre de ligne sur les perfs
    Par pram dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/02/2005, 14h08
  4. Paramétrer le nombre de connexion sur mon serveur Mysql
    Par Zerga dans le forum Installation
    Réponses: 2
    Dernier message: 12/12/2003, 19h21
  5. nombre de socket sur un meme port ?
    Par ginnovy dans le forum Développement
    Réponses: 3
    Dernier message: 25/10/2002, 10h52

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