2010-06-03 10 views
11

Ich versuche herauszufinden, wie Sprintf verwendet wird, um mindestens zwei Dezimalstellen und keine führenden Nullen zu drucken. Zum Beispielprintf, sprintf Druck mindestens zwei Dezimalstellen

Eingang:

23 
23.0 
23.5 
23.55 
23.555 
23.0000 

Ausgang:

23.00 
23.00 
23.50 
23.55 
23.555 
23.00 

jede Formatierung Hilfe würde

Antwort

12

Es gibt keine eingebaute in Formatspezifizierer geschätzt. Sie könnten prüfen, ob die zu druckende Zahl zwei oder weniger Dezimalstellen (rund zu zwei Dezimalstellen und vergleichen) hat, und wenn ja, verwenden Sie% .02f. Wenn die Zahl mehr Dezimalstellen hat, verwenden Sie einen% g-Spezifizierer. Hier ist ein Beispiel in 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 

Ausgänge:

23.00 
23.00 
23.50 
23.55 
23.555 
0

Hat "23,555" .toFixed (2) nicht tun, was ich denke, es tut? (Javascript)

+0

Das Thema ist über Formatierung. Keine Rundung. Außerdem hat "toFixed" den Ruf, dass es in sich widersprüchlich ist, ob es auf oder abrundet. – Kafoso

+1

Der Unterschied zwischen Formatierung und Rundung scheint semantisch zu sein, wenn es darum geht, den Wert auf eine bestimmte Anzahl von Dezimalstellen zu formatieren. Wenn Sie einige Besonderheiten bezüglich der Inkonsistenz von 'toFixed' haben, könnte das eine hilfreiche Ergänzung sein. – SimplGy

2

in PHP könnten Sie

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

Nein. Er sagte * mindestens * 2 Dezimalstellen. Nur getestet, wird es in PHP abgeschnitten. – mpen

0

In PHP können Sie die number_format Funktion für diesen Zweck verwenden, zu, die auch Sie Trennzeichen ändern.

0

In php das ist was ich getan habe (inspiriert von diesem Beitrag). Vielleicht nicht die eleganteste, aber ... Ich habe eine Funktion zum Drucken von Zahlen als Strings gemacht. Ich wollte Flexibilität haben, also habe ich ein paar Parameter.

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 

Und die Funktion aufgerufen werden (mindestens zwei Dezimalstellen zu haben, aber max 4:

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

Wenn die Zahl 34,1, erhalten Sie 34,10

Wenn Die Nummer ist 34.12345 Sie erhalten 34.1235

usw.