2010-06-03 6 views

Respuesta

12

No hay tal incorporado especificador de formato. Puede verificar si el número que se imprimirá tiene dos o menos decimales (redondear a dos decimales y comparar), y si es así, use% .02f. Si el número tiene más decimales, use un especificador% g. He aquí un ejemplo en 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 

Salidas:

23.00 
23.00 
23.50 
23.55 
23.555 
0

significa "23.555" .toFixed (2) no hacer lo que creo que hace? (Javascript)

+0

El tema es sobre el formateo. No redondeando. Además, 'toFixed' tiene la reputación de ser muy inconsistente en cuanto a redondear hacia arriba o hacia abajo. – Kafoso

+1

La diferencia entre el formateo y el redondeo parece semántica cuando la pregunta es sobre el valor del formato a un cierto número de decimales. Si tiene algunos detalles sobre la incoherencia de 'toFixed' que podría ser una adición útil. – SimplGy

2

en PHP se puede utilizar

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

No. Él dijo * al menos * 2 decimales. Acabo de probar esto, se truncará en PHP. – mpen

0

En PHP, puede utilizar la función number_format para este propósito, también, que también le permite cambiar los delimitadores.

0

En php esto es lo que hice (inspirado en esta publicación). Quizás no sea el más elegante pero ... Hice una función para imprimir números como cadenas. Quería poder tener flexibilidad, así que tengo un par de parámetros.

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 

Y para llamar a la función (tener al menos dos decimales pero Max 4:

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

Si el número es 34.1, se obtiene 34.10

Si el número es 34.12345 obtienes 34.1235

etc.

Cuestiones relacionadas