[Perl]-Formatage de nombres

Résolu
blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention   -  
 Sergei Perlvitch -
Bonjour,

je souhaiterais formater un réel (à mettre en pourcentage) avec un cadrage sur la virgule (complément à espace à gauche). Pis si c'est possible, je voudrais mettre du texte après...

Ex :
 12,25 % de save full
100,00 % de save full
  1,57 % de save full

C'est possible dans un printf ?

J'ai essayé ça : "% 3.2f", mais ça ne marche pas (alignement à gauche).

Merci d'avance...

--
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    je ne suis pas sûr d'avoir compris ta demande.

    Ton exemple c'est ce que tu veux obtenir?
    Plutôt donne ce que tu as en entrée et ce que tu veux obtenir.Merci

    lami20j
    0
    1. blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Ben par exemple, entrée :

      12.458475
      1,475962
      100,0000

      Je ne veux conserver que 2 décimales, je veux cadrer sur la virgule avec des blancs de padding et je souhaite rajouter un peu de texte pour préciser l'unité...

      Et en sortie, ce que j'ai indiqué au message 1.

      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Extrait de : http://www.ftls.org/fr/initiation/perl/index9.shtml
    1. le format d'affichage
        Cette partie permet de connaître la façon dont vont être affichées les données (l'endroit, la manière, la taille ...) La taille est définie par le nombre de signes présents après le signe @ ou ^
    
        @>>>> indiquera que la valeur sera affichée sur 4 caractères justifiés à droite
        @<<<< même chose mais justifié à gauche
        @|||| même chose mais centré
        @###.## champ numérique avec 2 chiffres après la virgule
        @* champ multiligne, on ne s'occupe pas de la taille du champ à afficher
        ^>>> affichera un champ sur plusieurs lignes de 3 caractères lignes vides incluses
        ~ ^>>> même chose mais sans les lignes vides
        ~~ ^>>> même chose mais répétera l'affichage jusqu'à trouver une ligne vide 
    Je connais pas Perl (mais c'est promis "lami20j" je m'y mets dès que je peux), donc j'espère que c'est ça qui se rapporte à ton cas.
    ;-))
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Bon, sachant que Perl est un dérivé de Awk, voilà comment que ça se passe sous Awk :
    [jp@MDK tmpfs]$ cat fich.txt
    
    12,458475
    1,475962
    100,0000
    
    [jp@MDK tmpfs]$ while read i; do echo "$i" | awk 'END { printf " %6.2f %s\n",$1,"% de save full" }';done <fich.txt
    
      12,46 % de save full
       1,48 % de save full
     100,00 % de save full
    
    [jp@MDK tmpfs]$
    Si ça peut t'aider... ;-))
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Voilà une aproche.
    #! /usr/bin/perl 
    #
    use warnings;use strict;
    
    while (<DATA>){
    	$_ = substr( " " x 20 . sprintf("%3.2f",$_), -6);
    # la seule chose qui reste à faire c'est de calculer 
    # la longueur de la partie entière et prendre le maximum 
    # pour obtenir exact ce que tu veux.
    # Ici j'ai mis 6 puisque je savais ce que tu veux
    	print "$_ % de save full\n";
    }
    __END__
    12.458475 
    1.475962
    100.0000
    Le résultat
    lami20j@debian:~/bin/my_deb_perl$ perl ccm_blux_format.pl
     12.46 % de save full
      1.48 % de save full
    100.00 % de save full


    Ou même

    #! /usr/bin/perl 
    #
    use warnings;use strict;
    
    while (<DATA>){
      printf "%6.2f %% de save full\n";
    }
    __END__
    12.458475 
    1.475962
    100.0000
    lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    en fait 6 il faut le remplacer avec la longueur de la "chaine" la plus grande

    Quand tu mets 3 alors l'alignement c'est par défaut au rapport de taille de chacun.

    lami20j

    P.S. Je n'ai pas pensé de début à ça (je parle de ma 2ème solution). Je suis parti avec l'idée de faire quelque chose compliqué.
    J'avoue que j'ai regarder le script de jipicy ;)
    - je n'ai pas vu la fôret à cause d'un arbre =))

    Mais lui aussi il est parti pour quelque chose compliqué
    perl formatage de nombres#2
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut lami20j,

      Y'a un "os" dans ta dernière solution ;-)))

      En fait avec "awk", l'expression "%6.2f" (4 + 2) signifie afficher un réel sur 6 positions, dont 2 pour la partie décimale, cadré à droite.

      C'est la seule solution que j'ai trouvée pour avoir un alignement sur la virgule.
      J'étais parti au début sur "%5.2f" (3 + 2), mais le résultat donné :
       12,46 % de save full
        1,48 % de save full
       100,00 % de save full
      Ce qui n'était pas bon.
      Donc j'ai rectifié le tir...

      ;-))
      0
  7. blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Bon ben merci à tous...

    J'ai pris le plus simple :
    printf(" %6.2f %s",$MMINFO[$i][10],"% de savesets en level full");

    Et ça me va bien...:-)
    0
  8. Sergei Perlvitch
     
    Ma solution:

    printf ( "%6s de savesets en level full" , sprintf("%8.2f",$_) );
    0