Printf : partie entière avec nombre de zéros significatifs

  • Auteur de la discussion Auteur de la discussion chamagne
  • Date de début Date de début
WRInaute discret
Bonsoir,
Soit le nombre décimal 123.456
Je souhaiterais afficher en php avec printf 5 chiffres significatifs pour la partie entière en complétant par des zéros (pour la partie décimale je sais faire)
Bien sûr je pourrais le faire en séparant partie entière et partie décimale et en faisant un affichage de chacune séparés par un point, mais ça n'est pas très académique.
Donc 123.456 devrait s'afficher sous la forme 00123.456
Merci de votre aide
 
WRInaute discret
Bonsoir,

Je pense qu'il faut bricoler une fonction qui compte combien il y a de chiffre, et concatène avec des 0 devant :
En supposant que ton nombre est stocké dans $lachaîne :


Code:
// ajout des 0 
while(strlen($lachaine) < 5)
      $lachaine = "0" . $lachaine;

// affichage du nombre 
printf ("%s", $lachaîne);
Bonne chance
Alexis
 
WRInaute discret
Bonjour
Merci, mais c'est aussi du bricolage comme ma solution alternative proposée.
De plus votre code ne fonctionne pas car c'est la partie entière qui doit faire 5 chiffres et non l'ensemble de la chaîne.
Une des solutions, pas bien belle, serait :
Code:
echo sprintf('%05d', 123.456).'.'.substr((123.456 - intval(123.456)), 2);
N'y a-t-il pas plus simple ?
 
WRInaute accro
PHP:
<span class="syntaxdefault">    $v </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'123.456'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    printf</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'%010s'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $v</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>
En revanche je suppose que tu n'a pas toujours 3 chiffres derrière la virgule.
PHP:
<span class="syntaxdefault">    $v </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'123.456'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    printf</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'%013f'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $v</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>
Donne une réponse "symétrique".
 
WRInaute discret
Bonjour
Curieux ce %013f, il donne 6 chiffres de part et d'autre de la virgule.
Par contre avec %011f il en met 4 avant et 6 après.
Et avec %015f 8 avant et 6 après.
Il semble donc que php adapte la longueur de la partie entière mais que la partie décimale comporte toujours 6 chiffres (du moins avec ce type de format).
Bizarre qu'on puisse gérer le nombre de chiffres après la virgule (avec le .), mais pas celui des chiffres avant !
J'ai bien l'impression qu'hors magouille telle que j'ai cité, il n'y a pas de moyen direct d'afficher 5 chiffres en partie entière sans toucher à la partie décimale, donc je vais magouiller.
 
WRInaute impliqué
tu as essayé un truc comme ça ?

PHP:
<span class="syntaxdefault"><br />$decimal </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $mon_nombre </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$mon_nombre</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span><span class="syntaxcomment">//je recupere la partie après la virgule<br /></span><span class="syntaxdefault">$entier </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$mon_nombre</span><span class="syntaxkeyword">);</span><span class="syntaxdefault">  </span><span class="syntaxcomment">// et la partie avant<br /><br /><br /></span><span class="syntaxkeyword">while(</span><span class="syntaxdefault">strlen</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$entier</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword"><</span><span class="syntaxdefault"> 5</span><span class="syntaxkeyword">){<br /></span><span class="syntaxdefault">      $entier </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"0"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">.</span><span class="syntaxdefault"> $entier</span><span class="syntaxkeyword">;<br />}<br /><br /></span><span class="syntaxdefault">$mon_nombre </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $entier </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> $decimal</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">printf </span><span class="syntaxkeyword">(</span><span class="syntaxstring">"%s"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $mon_nombre</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>
 
WRInaute occasionnel
vraiment au plus simple; le plus court que j'ai trouvé:

PHP:
<span class="syntaxdefault">$a</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">123.456</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$a</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">substr</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'0000'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">,-</span><span class="syntaxdefault">5</span><span class="syntaxkeyword">).</span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">.(</span><span class="syntaxdefault">$a</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">)*</span><span class="syntaxdefault">1000</span><span class="syntaxkeyword">;<br />echo&nbsp;</span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">;<br /></span><span class="syntaxcomment">//Retourne 00123.456 &nbsp;</span><span class="syntaxdefault"></span>

PHP:
<span class="syntaxdefault">$a</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">123456.789</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$a</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">substr</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'0000000'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">,-</span><span class="syntaxdefault">7</span><span class="syntaxkeyword">).</span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">intval</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$a</span><span class="syntaxkeyword">-</span><span class="syntaxdefault">$b</span><span class="syntaxkeyword">)*</span><span class="syntaxdefault">1000</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">echo $b</span><span class="syntaxkeyword">;<br /></span><span class="syntaxcomment">//Retourne 0123456.789<br /></span><span class="syntaxdefault"> </span>
 
WRInaute discret
Merci à tous
depuis mon dernier message j'avais pas mal de soucis d'ordinateur
après achat nouveau dont un des composants coinçait (GRRR !), suis enfin opérationnel et ai pu récupérer mes mails
Je considère ce message comme RESOLU.
@+
 
Discussions similaires
Haut