is_numeric()
La funzione is_numeric() in PHP verifica se una variabile è numerica o meno, accettando sia numeri che stringhe numeriche.
Introduzione
is_numeric() è una funzione integrata di PHP che verifica se un valore è un numero o una stringa numerica. Quest'ultima parte è il motivo principale per cui esiste: PHP riceve spesso i numeri come stringhe — da campi form, parametri di query, JSON, file CSV — e occorre un modo affidabile per chiedersi "questo potrebbe essere trattato come un numero?" prima di eseguire operazioni aritmetiche. is_numeric() risponde esattamente a questa domanda e restituisce un boolean.
Questa pagina descrive la sintassi, cosa viene considerato numerico (e cosa sorprendentemente non lo è), le differenze rispetto a is_int() e is_float(), e un pattern pratico di validazione dell'input.
Sintassi
is_numeric(mixed $value): boolAccetta un singolo argomento, $value, e restituisce true se $value è un numero o una stringa numerica, e false altrimenti. Non genera mai eccezioni e non modifica il suo argomento.
Esempio di base
$var1 è la stringa "42", $var2 è il float 3.14 e $var3 è la stringa "hello". I primi due sono numerici, quindi is_numeric() restituisce true; il terzo non lo è.
Suggerimento: usa
var_dump()anzichéechoquando testi i boolean.echostampatruecome"1"efalsecome stringa vuota, il che è facile da fraintendere.var_dump()stampabool(true)/bool(false), rendendo il risultato inequivocabile.
Cosa viene considerato numerico
Una stringa è numerica quando rappresenta un intero o un float valido in notazione decimale o scientifica. Ciò include un segno iniziale, un punto decimale iniziale o finale, spazi bianchi circostanti ed esponenti:
<?php
var_dump(is_numeric("1e3")); // bool(true) — scientific notation (1000)
var_dump(is_numeric("+42")); // bool(true) — leading sign
var_dump(is_numeric("-0.5")); // bool(true) — negative float
var_dump(is_numeric(".5")); // bool(true) — leading decimal point
var_dump(is_numeric(" 42")); // bool(true) — leading whitespace
var_dump(is_numeric("0x1A")); // bool(false) — hex strings are NOT numeric (since PHP 7)
var_dump(is_numeric("0b101")); // bool(false) — binary strings are not numeric
var_dump(is_numeric("")); // bool(false) — empty string
var_dump(is_numeric("42px")); // bool(false) — trailing non-numeric characters
?>Gli errori comuni:
- Le stringhe esadecimali e binarie restituiscono
false."0x1A"era considerato numerico prima di PHP 7, ma non lo è più. I letterali numerici scritti nel codice (es.0x1A) sono già interi reali, quindiis_numeric()vede un semplice int e restituiscetrue. - Un'unità in coda rende l'intera stringa non numerica.
"42px"èfalse. Se occorre estrarre un numero da una stringa simile, usa il cast(int)oppurefilter_var(). - Gli spazi bianchi iniziali/finali sono tollerati (gli spazi finali sono stati accettati a partire da PHP 8.0).
is_numeric() vs. is_int() e is_float()
Queste tre funzioni sono facili da confondere. La differenza sta nel fatto che interessa il tipo o solo il valore:
<?php
$value = "10"; // a string that looks like a number
var_dump(is_numeric($value)); // bool(true) — value can be a number
var_dump(is_int($value)); // bool(false) — type is string, not int
var_dump(is_float($value)); // bool(false) — type is string, not float
?>is_numeric()si interessa al valore: "questo potrebbe essere un numero?" Accetta le stringhe numeriche.is_int()eis_float()si interessano al tipo dichiarato: restituisconotruesolo per uninto unfloatreale, mai per una stringa.
Usa is_numeric() quando validi input che arriva come testo; usa is_int() / is_float() quando hai effettivamente bisogno di conoscere il tipo di una variabile.
Uso pratico: validare l'input prima di operazioni aritmetiche
Il tipico caso d'uso reale di is_numeric() è proteggere le operazioni aritmetiche su input non attendibile, per evitare TypeError o silenziosi 0:
<?php
$inputs = ["100", "12.5", "5e2", "abc", "12px", ""];
foreach ($inputs as $in) {
if (is_numeric($in)) {
echo "$in is numeric -> " . ($in + 0) . "\n";
} else {
echo "$in is NOT numeric\n";
}
}
// 100 is numeric -> 100
// 12.5 is numeric -> 12.5
// 5e2 is numeric -> 500
// abc is NOT numeric
// 12px is NOT numeric
// is NOT numeric
?>Aggiungere + 0 (o eseguire il cast con (int) / (float)) converte la stringa validata in un numero reale, una volta che sai che è sicuro farlo. Per una validazione più rigorosa — ad esempio, accettare solo interi o applicare un intervallo — combinala con filter_var() e i filtri FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT.
Conclusione
is_numeric() indica in modo affidabile se un valore — inclusa una stringa — può essere trattato come un numero, rendendola il controllo corretto da eseguire prima di operazioni aritmetiche su dati provenienti da form, URL o file. Ricorda che restituisce false per le stringhe esadecimali/binarie e per qualsiasi stringa con caratteri non numerici in coda, e che controlla il valore, non il tipo — usa is_int() o is_float() quando conta il tipo dichiarato. Vedi anche gettype() e PHP Data Types per il quadro completo.