2010-06-03 10 views
11

J'essaie de comprendre comment utiliser sprintf pour imprimer au moins deux décimales et pas de zéros. Par exempleprintf, sprintf imprime au moins deux décimales

entrée:

23 
23.0 
23.5 
23.55 
23.555 
23.0000 

sortie:

23.00 
23.00 
23.50 
23.55 
23.555 
23.00 

toute aide de formatage serait apprécié

Répondre

12

Il n'y a pas intégré spécificateur de format. Vous pouvez vérifier si le nombre à imprimer a deux décimales ou moins (arrondir à deux décimales et comparer), et si c'est le cas, utilisez% .02f. Si le nombre a plus de décimales, utilisez un spécificateur% g. Voici un exemple de Ruby:

def print_two_dec(number) 
    rounded = (number*100).to_i/100.0 
    if number == rounded 
    printf "%.02f\n", number 
    else 
    printf "%g\n", number 
    end 
end 

[ 23, 23.0, 23.5, 23.55, 23.555 ].each do |number| 
    print_two_dec(number) 
end 

Sorties:

23.00 
23.00 
23.50 
23.55 
23.555 
0

Est-ce que "23,555" .toFixed (2) pas ce que je pense qu'il fait? (Javascript)

+0

Le sujet concerne le formatage. Ne pas arrondir En outre, 'toFixed' a la réputation d'être follement inconsistante quant à savoir si elle arrondit vers le haut ou vers le bas. – Kafoso

+1

La différence entre la mise en forme et l'arrondi semble sémantique lorsque la question concerne la mise en valeur d'un certain nombre de décimales. Si vous avez des détails sur l'incohérence de 'toFixed', cela pourrait être utile. – SimplGy

2

en PHP, vous pouvez utiliser

<?php 
$number = 0.56; 
echo sprintf("%0.2f",$number); 
+1

Non. Il a dit * au moins * 2 décimales. Juste testé cela, il va tronquer en PHP. – mpen

0

En PHP, vous pouvez utiliser la fonction number_format à cet effet, aussi, ce qui vous permet également de changer délimiteurs.

0

En php c'est ce que j'ai fait (inspiré par ce post). Peut-être pas le plus élégant mais ... J'ai fait une fonction pour l'impression des nombres en tant que chaînes. Je voulais pouvoir avoir de la flexibilité, donc j'ai quelques paramètres.

PHP:

function print_num($num,$numdec,$atleast = false,$max_dec = -1) 
{ 

    $ret_norm = false; 

    if (!$atleast) 
    $ret_norm = true; 
    else //atleast = true 
    { 
    //Want at least $numdec decimals 

    //Do we have two or fewer and want to return two or fewer? 
    if ($num == ((int)($num*100)/100) & $numdec <= 2) 
     $ret_norm = true; 
    else 
    { 
     //See if we have enough dec. already 
     $just_dec = substr((string)$num,strpos((string)$num,".") + 1); 
     if ($numdec >= strlen($just_dec)) 
     $ret_norm = true; 
     else 
     { 
     //More decimals than at least value - make sure we don't go over max if set 
     if ($max_dec >= 0 && strlen($just_dec) > $max_dec) 
     { 
      //Confine to max_dec length 
      $ret_norm = true; 
      $numdec = $max_dec;     //Set for sprintf below 
      $num = number_format($num,$max_dec); //Round the value so doesn't just chop off 

     } 
     else if ($max_dec >= 0) 
      $ret_norm = false; 
     } //else 
    } //else 
    } //else atlest 

    if ($ret_norm) 
    return sprintf("%0.".$numdec."f",$num); 
    else 
     return sprintf("%s",$num); //print as is 

} //print_num 

Et pour appeler la fonction (avoir au moins deux décimales, mais max 4:

print_num($mynum,2,true,4); 

Si le nombre est de 34,1, vous obtenez 34,10

Si le nombre est 34.12345 vous obtenez 34.1235

etc.