floatval()
La funzione floatval() è una funzione built-in di PHP che converte una variabile in un numero float (virgola mobile). È simile alla funzione doubleval(),
Introduzione
La funzione floatval() è una funzione built-in di PHP che restituisce il valore float (virgola mobile) di una variabile. La si utilizza ogni volta che si ha un valore di tipo incerto — tipicamente una string proveniente da un form, da una query string, da un file CSV o da un payload JSON — e si vuole essere sicuri di lavorare con un numero su cui si possono eseguire operazioni aritmetiche.
floatval() è un alias di doubleval(). PHP non ha un tipo double separato — float e double sono la stessa cosa — quindi le due funzioni sono intercambiabili; floatval() è la forma da preferire nel nuovo codice.
Questa pagina tratta la sintassi, il modo in cui la funzione analizza i diversi input (inclusa la regola che all'inizio può sorprendere per le string), il confronto con il cast (float) e i trabocchetti da conoscere.
Sintassi
float floatval(mixed $value)Accetta un singolo argomento, $value, e restituisce il suo valore float. L'argomento dovrebbe essere uno scalare (string, int, float o boolean); passare un array restituisce 1.0 per un array non vuoto e 0.0 per uno vuoto, mentre passare un object genera un errore.
Esempio di utilizzo
L'esempio seguente converte diversi tipi e stampa il risultato. Si noti che floatval() restituisce un float, ma quando PHP stampa un float con valore intero tramite echo omette il .0 finale — quindi 42.0 viene visualizzato come 42.
Qui $var1 è una string numerica, $var2 è un intero, $var3 è un boolean e $var4 è una string senza numero iniziale. Ognuno viene convertito in float. Per verificare che il risultato sia effettivamente un float (invece di affidarsi a ciò che echo mostra), avvolgere un valore in var_dump(): var_dump(floatval(42)); stampa float(42).
Come vengono analizzate le string
Questa è la parte che coglie di sorpresa. Quando riceve una string, floatval() legge la parte numerica iniziale e si ferma al primo carattere che non può far parte di un numero. Non richiede che l'intera string sia numerica.
<?php
echo floatval("12.5abc") . "\n"; // 12.5 (stops at "a")
echo floatval(" 7.0kg") . "\n"; // 7 (leading whitespace is skipped)
echo floatval("1.0e3") . "\n"; // 1000 (scientific notation is understood)
echo floatval("$199.99") . "\n"; // 0 (starts with "$", no leading number)
echo floatval("0x1A") . "\n"; // 0 (hex strings are NOT parsed)
echo floatval("") . "\n"; // 0 (empty string)
?>Le regole principali:
- Gli spazi iniziali vengono ignorati; la scansione inizia dal primo carattere non-spazio.
- La notazione scientifica (
1.0e3) e un segno iniziale (-3.5,+2) sono riconosciuti. - L'analisi si ferma al primo carattere non numerico e tutto ciò che segue viene scartato.
- Se non c'è alcun numero iniziale, il risultato è
0.0. Ciò significa che una string come"$199.99"produce0, non199.99— rimuovere prima il simbolo. - Le string esadecimali come
"0x1A"vengono trattate come il numero0, perché la scansione si ferma allax.
floatval() vs. il cast (float)
floatval($x) e (float) $x producono lo stesso risultato per input scalari, quindi per un singolo valore il cast è più breve:
<?php
$price = "49.95 USD";
echo floatval($price) . "\n"; // 49.95
echo (float) $price . "\n"; // 49.95
?>Il vantaggio di floatval() è che è callable. Può essere passata direttamente a funzioni di ordine superiore dove una parola chiave di cast non può essere usata:
<?php
$inputs = ["1.5", "2.25", "x", "3"];
$floats = array_map('floatval', $inputs);
print_r($floats);
// Array ( [0] => 1.5 [1] => 2.25 [2] => 0 [3] => 3 )
?>Se si ha bisogno di una validazione rigorosa — rifiutando qualsiasi cosa che non sia un numero pulito invece di convertirla silenziosamente — usare is_numeric() o filter_var($x, FILTER_VALIDATE_FLOAT) prima di convertire, poiché floatval() non segnala mai un fallimento.
Quando usarla
- Normalizzare l'input dell'utente (
$_POST,$_GET) o dati CSV/testo prima di eseguire calcoli. - Come callback per
array_map(), confronti conusort()e simili. - Convertire un valore il cui tipo non si controlla in un
floatgarantito.
Se si vuole un intero invece, usare intval(); per cambiare il tipo di una variabile in-place usare settype(); per verificare un tipo usare gettype() o is_float(). Per una panoramica su come PHP gestisce i tipi, vedere PHP Data Types.
Conclusione
floatval() restituisce il valore float di qualsiasi scalare e non genera mai errori su input non validi — torna a 0.0 invece. Questo la rende conveniente, ma significa anche che si dovrebbe validare prima quando un numero mancante o malformato deve essere trattato come un errore. Ricordare la regola della string numerica iniziale ("12.5abc" diventa 12.5, "$199.99" diventa 0) e scegliere floatval() rispetto a un cast ogni volta che si deve passare la conversione come callback.