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 :

Justifier un flottant avec des zéros à gauche


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut Justifier un flottant avec des zéros à gauche
    Bonjour à tous

    Aujourd'hui j'ai eu un souci: je voulais justifier un flottant avec 3 zéros à gauche et ensuite 2 décimales (python v2.6).
    J'ai bêtement essayé print "%03.2f" % val et là ben ça n'a pas marché. Et en fait je me suis rendu compte que le %0n ne marche qu'avec %d => %03d

    Finalement je m'en suis sorti de cette façon
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import string
    print string.zfill("%.2f" % val, 6)    # 6 parce que 2 décimales + 1 point + 3 zéros

    Est-ce qu'il y aurait une méthode plus élégante ?

    Merci de m'avoir lu
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> n = '5.02'
    >>> print n.rjust(len(n)+3, '0')
    0005.02
    ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> n = '5.02'
    >>> print n.rjust(len(n)+3, '0')
    0005.02
    ?
    Désolé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> n = '15.02'
    >>> print n.rjust(len(n)+3, '0')
    00015.02
    Moi je veux 3 digits max avant la virgule => 5.02 donne 005.02 mais 15.02 donne 015.02.

    Merci toutefois de m'avoir montré rjust() car ça m'amène à print n.rjust(3+3, '0') # 3 digits plus "." + 2 chiffres après la virgule et si on part de la valeur flotante val=15.02 alors ce sera print ("%.2f" % val).rjust(3+3, '0') ce qui équivaut à zfill (mais qui m'évite toutefois d'inclure le module string que j'ai inclus juste pour ça)...

    Petit souci: je ne peux pas décomposer la chose car mon traitement est un poil plus complexe.
    En effet, je pars d'un tableau contenant des valeurs style tab=[12, 25, 56.1234] et je dois créer une chaine concaténant chaque valeur sur 3 digits => "012025056.12"

    Pour l'instant, en utilisant rjust() j'arrive à ça
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> modele=(("%d", 0), ("%d", 0), ("%.2f", 3))
    >>> "".join([(f[0] % x).rjust(3 + f[1], '0') for (f, x) in zip(modele, tab)])
    '012025056.12'
    Ce qui n'est pas si mal...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Autre proposition en utilisant la méthode format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "{0:0>6.2f}".format(3.1234567890)
    003.12
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Personnellement, j'ai envie de conclure à un léger bug dans le portage/adaptation/cekevouvoulez de la famille printf du C standard sous python, ou bien? Je ne l'avais jamais remarqué, pourtant c'est énorme...

    A+,

    Pfeuh

    PS, je viens d'essayer et empiriquement (on parle d'un bug quand même...) j'ai cru comprendre que le 3 du format "%03.2" doit être remplacé par la taille totale, donc "%06.2". Et là, miracle, ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    value = 12.345678
    print "%06.2f"%value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >pythonw -u "dummy.py"         
    012.35
    >Exit code: 0

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce n'est pas un bug. La doc Python parle bien de "field width", et c'est très pratique, quand on a à présenter des nombres en colonne, de pouvoir fixer le nombre de caractères de chaque colonne. Tout autre solution nécessiterait de faire des calculs sur chaque nombre.

    Les 2 méthodes % et .format donnent d'ailleurs le même résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print "%06.2f" % (3.1234567890,)
    003.12
    print "{0:06.2f}".format(3.1234567890)
    003.12
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    c'est très pratique, quand on a à présenter des nombres en colonne
    Tout à fait. Je trouve juste dommage cet écart de comportement (même si c'est documenté en python), alors que la plus grosse partie des formatages est identique en C et en python. En C aussi on peut aligner les nombres à droite. Mais ce n'est qu'un point de vue.

    A+

    Pfeuh

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    je viens d'essayer et empiriquement (on parle d'un bug quand même...) j'ai cru comprendre que le 3 du format "%03.2" doit être remplacé par la taille totale, donc "%06.2". Et là, miracle, ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    value = 12.345678
    print "%06.2f"%value

    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Ce n'est pas un bug. La doc Python parle bien de "field width", et c'est très pratique, quand on a à présenter des nombres en colonne, de pouvoir fixer le nombre de caractères de chaque colonne. Tout autre solution nécessiterait de faire des calculs sur chaque nombre.
    Bien vu. Faut indiquer la taille totale !!! J'aurais dû y penser moi-même surtout que c'est ce que je fais avec rjust(). Merci de votre indulgence
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Champ caractère avec des zéros à gauche
    Par tassia dans le forum SAS Base
    Réponses: 3
    Dernier message: 23/03/2015, 11h29
  2. Fomatter un nombre avec des zéro à gauche
    Par birt1976 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/10/2008, 17h02
  3. Cadrer une variable avec des zéros à gauche
    Par saysay dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/08/2008, 11h05
  4. NE pas autoriser des chiffres avec des zéros
    Par celiaaa dans le forum VBA Access
    Réponses: 5
    Dernier message: 01/11/2007, 14h57
  5. [XSLT] Suppression des zéros à gauche d'un nombre
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/03/2007, 10h32

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