Virgola mobile formato numerico
-
20-09-2019 - |
Domanda
Voglio usare la funzione number_format
in PHP. Ad esempio:
$number = 234.51;
echo number_format($number,2);
Questo funziona per numeri float ma voglio usarlo per numeri diversi. Se un numero è decimale e non ha alcun punto galleggiamento, mostra come: 145.00. Come posso risolvere questo problema? Voglio dire che voglio mostrare il maggior numero di punti mobili come necessario, non di più.
Soluzione 2
Credo che non riesco a ottenere quello che voglio da number_format così ho fatto questo e funziona benissimo:
public function floatNumber($number)
{
$number_array = explode('.', $number);
$left = $number_array[0];
$right = $number_array[1];
return number_format($number, strlen($right));
}
Ringraziamo tutti per le vostre risposte.
Altri suggerimenti
Indagare le funzioni printf
e sprintf
invece di number_format
.
Essi danno la possibilità di formattare i numeri come si desidera.
printf("%d", $int)
sarebbe opportuno per un intero decimale.
printf("%4.2f", $float)
sarebbe appropriato per un numero in virgola mobile con due cifre decimali.
number_format
sembra essere destinato per l'internazionalizzazione della produzione di valuta, ma non credo che è quello che si vuole, perché lei ha citato i numeri decimali 'tutto'.
Non conosco un modo migliore per fare questo, ma è possibile confrontare il tipo, come il codice qui sotto:
$number = 234.159;
if(is_float($number)) {
echo number_format($number, 2);
}else {
echo $number;
}
Mentre è un po 'veloce e sporco, si può semplicemente fare un ...
str_replace('.00', '', number_format($potentialFloat, 2));
lungi dall'essere ideale, ma efficace.
Credo che il problema chiave è la definizione di come sono necessarie molte posizioni. Ti definisci 13.01 come 13 perché la prima cifra decimale era un 0? Dal momento che printf e il formato numero che si ha bisogno di sapere quanti decimali, non so che che avrebbe funzionato per voi.
Forse qualcosa di simile (che è un sacco di funzioni, ma sembra per la prima 0, e poi restituisce la stringa troncata). Sì, è ad alta intensità, ma può essere il modo migliore per voi.
function show_number($number, $max = 8){ if(strpos($number, '.')){ $decimal = strpos($number, '.'); if(strpos($number, '.0')){ return substr($number, 0, $decimal);//returns whole if zero is first } else { if(strpos(substr($number, $decimal, $max), '0')){ $zero = strpos(substr($number, $decimal, $max), '0'); return substr($number, 0, $decimal+$zero);//returns number w/0 first zero } else { return substr($number, 0, $decimal+$max+1); //returns number with max places } } } else { return $number; //returns number if no decimals } }
rtrim(number_format($number, 2), '0.');
Io uso il seguente per sbarazzarsi di zeri finali:
// Trims a floating point number so there are no trailing zeros. For example:
// 1.00 -> 1
// 1.10 -> 1.1
function trimFloatingPoint($input) {
$strNum = strval($input);
while(substr($strNum, -1, 1) == '0')
$strNum = substr($strNum, 0, strlen($strNum) -1);
// Trailing zeros are gone. How about the trailing period?
if(substr($strNum, -1, 1) == '.')
$strNum = substr($strNum, 0, strlen($strNum) -1);
return $strNum;
}
$x = $x - floor($x)
vi darà il giusto punto di galleggiamento ...