2010-06-03 22 views
11

Sto cercando di capire come utilizzare sprintf per stampare almeno due posizioni decimali e zero iniziali. Per esempioprintf, sprintf stampa almeno due cifre decimali

ingresso:

23 
23.0 
23.5 
23.55 
23.555 
23.0000 

uscita:

23.00 
23.00 
23.50 
23.55 
23.555 
23.00 

alcun aiuto formattazione sarebbe apprezzato

risposta

12

Non esiste integrato di formato. È possibile verificare se il numero da stampare ha due o meno decimali (arrotondare a due decimali e confrontare), e in tal caso utilizzare% .02f. Se il numero ha più decimali, utilizzare un identificatore% g. Ecco un esempio 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 

Uscite:

23.00 
23.00 
23.50 
23.55 
23.555 
0

Vuol "23,555" .toFixed (2) Non fare quello che penso che fa? (Javascript)

+0

L'argomento riguarda la formattazione. Non arrotondare. Inoltre, 'toFixed' ha la reputazione di essere selvaggiamente incoerente sul fatto che giri in su o in giù. – Kafoso

+1

La differenza tra la formattazione e l'arrotondamento sembra semantica quando la domanda riguarda il valore di formattazione per un determinato numero di posizioni decimali. Se hai delle specifiche sull'incoerenza di 'toFixed 'potrebbe essere un'utile aggiunta. – SimplGy

2

in PHP è possibile utilizzare

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

No. Ha detto * almeno * 2 posizioni decimali. Appena testato, verrà troncato in PHP. – mpen

0

In PHP, è possibile utilizzare la funzione number_format per questo scopo, anche, che permette anche di modificare delimitatori.

0

In php questo è quello che ho fatto (ispirato da questo post). Forse non il più elegante, ma ... Ho creato una funzione per stampare numeri come stringhe. Volevo essere in grado di avere flessibilità, quindi ho un paio di parametri.

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 

E per chiamare la funzione (per avere almeno due decimali, ma max 4:

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

Se il numero è 34.1, si ottiene 34,10

Se il numero è 34.12345 ottieni 34.1235

ecc.

Problemi correlati