Mostra un numero con due cifre decimali


572

Qual è il modo corretto di arrotondare una stringa PHP a due cifre decimali?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

L'output dovrebbe essere 520.00;

Come dovrebbe round_to_2dp()essere la definizione della funzione?


13
Questo in realtà non è "arrotondamento". L'arrotondamento riduce la precisione. Non aggiungerà i decimali a un numero che non li ha. Basato su molte delle risposte e dei commenti, sembra che la gente stia pensando che l'arrotondamento sia qualcosa che non lo è. roundè una funzione matematica e questo è solo un problema di formattazione.
Non

Risposte:


1132

Puoi usare number_format () :

return number_format((float)$number, 2, '.', '');

Esempio:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

Questa funzione restituisce una stringa .


4
round () sarebbe meglio anche per la sua leggibilità e semplicità, ma per qualsiasi cosa critica essere consapevoli del fatto che è stato conosciuto per essere buggy
StringsOnFire,

40
@ ÁlvaroG.Vicario roundnon risolve il problema del PO qui. round("520", 2)restituisce il float 520e l'eco che ovviamente non lo mostrerà con 2 decimali. Ai fini dell'OP - che mostra un numero intero con 2 cifre decimali riempiendolo di zero finali - è necessaria una funzione di formattazione numerica, non una funzione di arrotondamento.
Mark Amery,

3
Tutte le altre risposte sono limitate ai valori decimali con una notazione punto. Quando è necessario ottenere 520,00invece di 520.00, funziona semplicemente.
SPRBRN,

1
se vuoi limitare solo float ma non int allora bcdiv ($ number, 1,2)
Wasim A.

2
Penso che dovresti usare bcadd (0, $ yournumber, 2) ti darà un risultato perfetto.
Jewelhuq

214

Usa round()(usa se ti aspetti un numero solo in formato float, altrimenti usa number_format () come risposta data da Codemwnci ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

Dal manuale:

Descrizione:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

Restituisce il valore arrotondato di vala specificato precision(numero di cifre dopo il punto decimale). precisionpuò anche essere negativo o zero (impostazione predefinita).

...

Esempio # 1 round()esempi

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

Esempio n. 2 esempi di modalità

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>

5
@khuderm round($number, 2);non funziona. Voglio 520,00 non 520. Non posso credere che il round non lo faccia per impostazione predefinita.
Claudiu Creanga,

2
Non risponde nemmeno correttamente al PO ma ha oltre 100 voti in più!
Rob Sedgwick,

200

In alternativa,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00

3
E se vuoi 520,00? Immagino che l'altra risposta funzioni meglio in quel caso.
SPRBRN,

2
^ no, l'altra risposta non darà due cifre decimali per un int
pythonian29033

1
altri motivi per cui potresti desiderare questo è che non vuoi arrotondare ... o nella mia causa i float SQL restituiti non sono trattati allo stesso modo dei float normali che è un bug matematico di PHP
Amb3rL4nn

34

http://php.net/manual/en/function.round.php

per esempio

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06

Round eseguirà esattamente le funzionalità richieste da Rich, ma numer_format () sarebbe più interessante esaminare tutti i tipi di formattazione numerica.
Shamim Hafiz,

Questo metodo eseguirà l'arrotondamento anche forzando semplicemente le cifre ".00" alla fine.
SystemX17

10
Ci avevo provato, ma non funziona - non aggiungerà il supplemento di .00.
Rich Bradshaw,

Prova a utilizzare uno degli esempi che ho lì, da solo in uno script PHP. Dovresti ottenere il risultato commentato. In caso contrario, hai un problema con la configurazione di PHP da qualche parte.
SystemX17

1
round (520, 2) restituisce 520, non 520,00 come richiesto da @Rich
user761100

25

Provare:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

L'output sarà:

1,234,545,454.00

2
Funziona, ma l'output sarebbe una stringa e non un numero.
Ethan,

1
se vuoi usare number_format almeno rendilo number_format ($ number, 2, '.', '')
Mihai P.

14

Puoi usare PHP printfosprintf funzioni:

Esempio con sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

Puoi eseguire lo stesso anche senza echo. Esempio:sprintf("%.3f", $num);

Produzione:

2.120

In alternativa, con printf:

echo printf("%.2f", $num);

Produzione:

2.124

12

Un altro modo più esotico per risolvere questo problema è utilizzare bcadd()con un valore fittizio per $ right_operand di 0.

$formatted_number = bcadd($number, 0, 2);

2
Si noti che le bc*funzioni non arrotondano per eccesso, ma arrotondano sempre per difetto. Ad esempio, bcadd("1.0999","0.0",1)restituisce "1.0", non "1.1".
ColinM,

1
Le funzioni BC Math in realtà interrompono l'elaborazione a $scalecifre frazionarie. Questo equivale ad arrotondamento verso lo zero.
Ali,



8
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Questo visualizzerà esattamente due cifre dopo il punto decimale.

Vantaggio:

Se si desidera visualizzare due cifre solo dopo un valore float e non per int, utilizzare questo.


Questa è la soluzione più universale se hai bcdiv (è un pacchetto stock ma non predefinito su centos6).
Shovas,

7

round_to_2dp è una funzione definita dall'utente e nulla può essere fatto a meno che tu non abbia pubblicato la dichiarazione di tale funzione.

Tuttavia, la mia ipotesi sta facendo questo: number_format($number, 2);


14
Dal tuo primo paragrafo, penso che tu abbia frainteso la domanda. round_to_2dp($number);era inteso come pseudocodice; l'OP stava chiedendo a qualcuno di dirgli con cosa sostituire quell'espressione.
Mark Amery,

6
$twoDecNum = sprintf('%0.2f', round($number, 2));

L'arrotondamento arrotonda correttamente il numero e lo sprint lo costringe a 2 decimali se risulta essere solo 1 decimale dopo l'arrotondamento.


6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Restituirà 5.98 senza arrotondare il numero.


Solo questo può fare anche il lavoro floor($retailPrice * 100) / 100; non è necessario il formato numerico.
somsgod,

6

Per arrotondamenti condizionali, ad es. mostra i decimali dove è veramente necessario altrimenti il ​​numero intero

123.56 => 12.56

123,00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    

6

Faccio il mio.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);

1
È bello vedere alcuni dei calcoli necessari per farlo. Anche se per me è preferito usare una funzione integrata. Non ha senso reinventare la ruota.
Lampadina 1

1
Siamo spiacenti, ma round (), come si dice, round de number e, a volte, non voglio arrotondare.
joanlgr,

5

Qui ottengo due decimali dopo il .(punto) usando una funzione ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

Risultati della funzione sopra:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

Nuova risposta corretta

Usa la funzione nativa PHP bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567

4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Questo ti darà 2 numeri dopo i decimali.


4
No non lo farà. Non so quando è stato scritto questo post, ma se lo provi con il tuo esempio, almeno sulla mia macchina :-), produrrà 520.90. Significato, si verificherà arrotondamento. Stai attento!
Boaz Rymland,

4

Se si desidera utilizzare due cifre decimali nell'intero progetto, è possibile definire:

bcscale(2);

Quindi la seguente funzione produrrà il risultato desiderato:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

Ma se non si utilizza la funzione bcscale, è necessario scrivere il codice come segue per ottenere il risultato desiderato.

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

Per saperne di più


2

Numero senza giro

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);

1

Ecco un'altra soluzione con strtok e str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')

0

Aggiungendo ad altre risposte, poiché number_format () aggiungerà per impostazione predefinita migliaia di separatori.

Per rimuoverlo, procedere come segue:

$number = number_format($number, 2, ".", "");

0
  • Scegli il numero di decimali
  • Formato virgole (,)
  • Un'opzione per tagliare gli zeri finali

Una volta per tutte!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

Esempi

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235

-6

Puoi usare la funzione PHP round () .

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06

3
-1; questa risposta non aggiunge nulla di nuovo che la risposta di Somnath Muluk non conteneva già 2 anni prima.
Mark Amery,

1
È anche sbagliato, come notato nel mio commento sulla risposta di Somnath.
Mark Amery,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.