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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    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 confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 : 4 049
    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
    ?

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    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 815
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    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 : 952
    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 confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    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

+ 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