2010-11-06 21 views
46

Mi piacerebbe sapere se esiste qualche funzione per formattare automaticamente un numero da esso è decimale, quindi se ho:PHP numero: punto decimale visibili solo se necessario

<?php 
    // $sql_result["col_number"] == 1,455.75 
    number_format ($sql_result["col_number"], 2, ".", ""); 
    // will return 1455.75 

    // $sql_result["col_number"] == 1,455.00 
    number_format ($sql_result["col_number"], 2, ".", ""); 
    // could I get 1455 instead of 1455.00? 
?> 

quindi la mia risposta è che se esiste un modo per rimuovere i decimali se ho dati DECIMAL nel mio DB solo quando è rotondo?

Oppure devo fare qualcosa del genere?

<?php 
    // $sql_result["col_number"] == 1,455.00 
    str_replace(".00", "", (string)number_format ($sql_result["col_number"], 2, ".", "")); 
    // will return 1455 
?> 
+1

Ecco una risposta concisa: http://stackoverflow.com/a/14531760/1431728 – JohnK

+3

@JohnK, ho appena realizzato che il link che hai dato è anche lui che l'ha chiesto l'anno scorso. Hahaha –

risposta

11

In realtà penso che la soluzione sia buona come qualsiasi. È semplice e chiaro, e non c'è davvero alcun senso parlare delle prestazioni qui, quindi basta provare.

+5

Puoi semplicemente aggiungere 0 '1455.00 + 0' http://stackoverflow.com/questions/14531679/remove-useless-zero-digits-from-decimals-in-php –

+0

La soluzione sostitutiva si interromperà con i numeri espressi in europeo formato di paesi, come la Germania o la Spagna. Ad esempio 9000 in Germania sono 9.000,00 e questo diventerà qualcosa come 90,00 – Cesc

8

Come dice Emil, le tue sono buone. Ma se si desidera rimuovere 0 da ad es. 7.50 troppo, ho un suggerimento, rtrim():

<?php 
    // if $sql_result["col_number"] == 1,455.50 
    rtrim(rtrim(number_format($sql_result["col_number"], 2, ".", ""), '0'), '.'); 
    // will return 1455.5 
?> 
+1

Penso che ci sarà un bug usando 'rtrim' in questa situazione, per esempio,' rtrim ('1230.00', '0.'); 'Darà 123 piuttosto che 1230. – bobo

+0

@bobo, Grazie, modificato :) –

+0

V bella soluzione Halil..Grazie :) –

0

In realtà penso che il modo più pulito che posso pensare di fare questo per qualcuno che ha appena fatto una ricerca alla ricerca di questo genere di cose è quello di fare questo:

(number_format ($sql_result["col_number"], 2) * 100)/100; 
-1

Che dire

number_format($value,2) - 0; 
0

Warren.S risposta mi ha aiutato. Non avevo bisogno della funzione number_format, così ho fatto questo

$value=$value-0; 

Ma nel caso del PO, ha bisogno number_format per rimuovere le virgole. Quindi questo dovrebbe funzionare per lui

$value=number_format ($sql_result["col_number"], 2, ".", "")-0; 
20

floatval o semplicemente la fusione di galleggiare

php > echo floatval(7.00); 
7 
php > echo floatval(2.30); 
2.3 
php > echo floatval(1.25); 
1.25 
php > echo floatval(1.125); 
1.125 

php > echo (float) 7.00; 
7 
php > echo (float) 2.30; 
2.3 
php > echo (float) 1.25; 
1.25 
php > echo (float) 1.125; 
1.125 
+1

il casting per il float è finora l'opzione migliore –

+4

Chiunque vorrebbe applicare questo ad una stringa dovrebbe fare attenzione ai valori con virgole come " 1.000.99 "Il valore di floating restituirà 1. –

+0

floatval() ha funzionato per me :) –

3

Si potrebbe anche usare rtrim(), che eliminerebbe 0s in eccesso, nel caso in cui si potrebbe desiderare di mantenere una decimale ma non gli zeri in eccesso. (Ad esempio, 4,50 diventa 4,5). Consente inoltre di modificare il numero di posizioni decimali da 2 a qualsiasi altro numero.

rtrim(rtrim((string)number_format($value, 2, ".", ""),"0"),"."); 

// 4.00 -> 4 
// 4.50 -> 4.5 
// 4.54000000 -> 4.54 (if you're doing more decimal places) 
0

Dal momento che non sono riuscito a trovare una soluzione flessibile ho scritto una semplice funzione per ottenere il miglior risultato:

function getValueFormattedWithMinimalDecimals($value, $max_decimals = 2, $dec_point = ',', $thousands_sep = '') { 
    $bestNumberOfDecimals = -1; 
    $decimal = 0; 
    while ($decimal <= $max_decimals) { 
     $bestNumberOfDecimals = $decimal; 
     $valueDecimals = number_format($value, $decimal); 
     if (floatval($value) == $valueDecimals) { 
      break; 
     } 
     $decimal++; 
    } 
    if($bestNumberOfDecimals > 0 && number_format($value, $bestNumberOfDecimals) == number_format($value, 0)) { 
     $bestNumberOfDecimals = 0; 
    } 

    return number_format($value, $bestNumberOfDecimals, $dec_point, $thousands_sep); 
} 
0

Se si prendono di mira valuta degli Stati Uniti mi piace usare questo metodo:

function moneyform($number, $symbol = true) { 
    return str_replace(".00", "", money_format(($symbol? '%.2n' : "%!n"), $number)); 
} 

moneyform(1300999); 
-->$1,300,999 

moneyform(2500.99); 
-->$2,500.99 

moneyform(2500.99, false); 
-->2,500.99 
Problemi correlati