Introduzione
Quando si parla di variabili e tipi di dato in PHP, uno degli aspetti più utili da padroneggiare è la gestione delle stringhe e della loro interazione con i tipi numerici. Nelle applicazioni reali, infatti, i dati arrivano spesso come testo: da un form HTML, da una richiesta API, da un file CSV o da un database. Solo dopo è necessario interpretarli come numeri per fare calcoli, confronti o validazioni.
Questo passaggio è un punto delicato in PHP perché il linguaggio è dinamico e, in molti casi, effettua conversioni automatiche. Questo comportamento può essere comodo, ma anche pericoloso se non viene controllato bene. In questo tutorial vedremo come riconoscere una stringa numerica, come convertirla in modo esplicito e come evitare errori tipici quando si lavora con importi, quantità, età o punteggi.
L’obiettivo è costruire un approccio pratico e robusto: validare prima, convertire poi. Così il codice diventa più leggibile, prevedibile e facile da mantenere.
Codice completo
<?php
declare(strict_types=1);
/**
* Esempio pratico:
* simuliamo dati in arrivo da un form o da una richiesta HTTP.
*/
$input = [
´nomeProdotto´ => ´Tastiera meccanica´,
´prezzo´ => ´79.90´,
´quantita´ => ´3´,
´sconto´ => ´10´,
´note´ => ´Disponibile´,
´codice´ => ´A12´
];
function isNumericString(string $value): bool
{
// is_numeric() verifica se una stringa rappresenta un numero valido
return is_numeric($value);
}
function toFloat(string $value): float
{
if (!isNumericString($value)) {
throw new InvalidArgumentException("Valore non numerico: {$value}");
}
return (float) $value;
}
function toInt(string $value): int
{
if (!isNumericString($value)) {
throw new InvalidArgumentException("Valore non numerico: {$value}");
}
return (int) $value;
}
try {
$prezzo = toFloat($input[´prezzo´]);
$quantita = toInt($input[´quantita´]);
$scontoPercentuale = toInt($input[´sconto´]);
// Calcolo del totale lordo
$totaleLordo = $prezzo * $quantita;
// Calcolo dello sconto in valore assoluto
$importoSconto = $totaleLordo * ($scontoPercentuale / 100);
// Totale finale
$totaleNetto = $totaleLordo - $importoSconto;
echo "<h3>Riepilogo ordine</h3>";
echo "<ul>";
echo "<li>Prodotto: " . htmlspecialchars($input[´nomeProdotto´]) . "</li>";
echo "<li>Prezzo unitario: €" . number_format($prezzo, 2, ´,´, ´.´) . "</li>";
echo "<li>Quantità: " . $quantita . "</li>";
echo "<li>Sconto: " . $scontoPercentuale . "%</li>";
echo "<li>Totale lordo: €" . number_format($totaleLordo, 2, ´,´, ´.´) . "</li>";
echo "<li>Totale netto: €" . number_format($totaleNetto, 2, ´,´, ´.´) . "</li>";
echo "</ul>";
// Esempio di controllo su una stringa non numerica
if (!isNumericString($input[´codice´])) {
echo "<p>Il campo ´codice´ non è numerico, quindi non deve essere usato nei calcoli.</p>";
}
} catch (InvalidArgumentException $e) {
echo "<p>Errore nei dati di input: " . htmlspecialchars($e->getMessage()) . "</p>";
} Spiegazione
Il codice sopra mostra un caso molto comune: alcuni valori arrivano come stringhe, ma devono essere trattati come numeri. In questo esempio:
- prezzo arriva come stringa, ma rappresenta un numero decimale;
- quantita arriva come stringa, ma deve diventare un intero;
- sconto è una percentuale espressa come testo, ma va convertita in numero;
- codice è una stringa che non deve essere interpretata come numero.
1. Perché usare is_numeric()
La funzione is_numeric() è utile per verificare se una stringa può essere interpretata come numero. È una prima difesa molto pratica quando i dati provengono da fonti esterne. Per esempio:
- "79.90" è numerica;
- "3" è numerica;
- "A12" non è numerica;
- "10€" non è numerica.
Questa verifica evita conversioni pericolose o risultati inattesi. In PHP, infatti, una stringa non valida può produrre comportamenti ambigui se usata direttamente in operazioni matematiche.
2. Casting esplicito verso int e float
Le funzioni toInt() e toFloat() incapsulano la logica di controllo e conversione. Prima verificano che il valore sia numerico, poi eseguono il casting:
- (int) per valori interi come quantità, età, pagine, livelli;
- (float) per valori decimali come prezzi, percentuali, distanze, misure.
Questo approccio è migliore rispetto a convertire direttamente senza controlli, perché rende il codice più affidabile e il comportamento più chiaro.
3. Calcolo del totale
Una volta convertiti i dati, il calcolo diventa semplice:
- totale lordo = prezzo × quantità;
- importo sconto = totale lordo × percentuale sconto / 100;
- totale netto = totale lordo - sconto.
Questa è una situazione tipica in e-commerce, gestionale o fatturazione. In tutti questi contesti, lavorare con stringhe non validate può causare errori nei calcoli economici, che sono tra i più delicati in assoluto.
4. number_format() per la presentazione
La funzione number_format() non serve per fare calcoli, ma per mostrare i numeri in un formato leggibile. Nell’esempio viene usata per visualizzare importi con due decimali e separatori italiani:
- €79,90
- €239,70
Separare il momento del calcolo da quello della visualizzazione è una buona abitudine: prima lavori sui dati grezzi, poi li formatti per l’utente.
5. htmlspecialchars() per l’output
Anche se il tema è quello dei tipi di dato, nel codice compare htmlspecialchars() per proteggere l’output HTML. È importante perché i dati in input possono contenere caratteri speciali o contenuti non affidabili. Questo è un esempio di best practice trasversale: quando mostri dati in pagina, escapi sempre ciò che proviene dall’esterno.
Best practice
- Valida sempre l’input prima di usarlo nei calcoli. Non fidarti mai del formato ricevuto da form o API.
- Usa casting esplicito invece di affidarti alle conversioni automatiche di PHP.
- Separa validazione e logica di business: prima controlli i dati, poi esegui il calcolo.
- Usa float solo quando serve davvero: per importi monetari complessi, valuta soluzioni più precise come librerie dedicate o interi in centesimi.
- Non trattare tutto come numero: codici, CAP, numeri di telefono e identificativi spesso devono restare stringhe.
- Formatta i dati solo in output, non prima. I calcoli devono lavorare su valori puliti e coerenti.
- Gestisci gli errori con eccezioni o controlli chiari, così il problema emerge subito e non si nasconde nel risultato finale.
Riepilogo
In PHP, stringhe e numeri convivono continuamente. Questo è normale, ma richiede attenzione. Il punto chiave è non confondere il valore testuale con il valore numerico: una stringa come "79.90" può diventare un float, mentre una stringa come "A12" deve restare testo.
Con questo approccio hai visto come:
- riconoscere una stringa numerica con is_numeric();
- convertire in modo sicuro con (int) e (float);
- evitare errori nei calcoli con dati provenienti dall’esterno;
- formattare correttamente i risultati per la visualizzazione.
Se vuoi scrivere codice PHP più robusto, questo è uno dei primi argomenti da padroneggiare: gestire bene il passaggio tra testo e numeri ti aiuta a prevenire bug, migliorare la leggibilità e costruire applicazioni più affidabili.
Approfondisci con risorse ufficiali
- PHP Manual - is_numeric(): documentazione ufficiale per verificare valori numerici.
- PHP Manual - Type Juggling: approfondimento sul comportamento automatico delle conversioni in PHP.
- PHP Manual - Type Declarations: per capire come usare i tipi nelle funzioni e nei parametri.
- PHP Manual - number_format(): utile per la formattazione degli importi e dei numeri.
- PHP Manual - htmlspecialchars(): fondamentale per proteggere l’output HTML.
