Come faccio a convertire una stringa in un numero in PHP?


670

Voglio convertire questi tipi di valori, '3', '2.34', '0.234343', ecc per un numero. In JavaScript possiamo usare Number(), ma esiste un metodo simile disponibile in PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

63
Lettore attenzione: non esiste una vera risposta a questa domanda :(
Matthieu Napoli

@MatthieuNapoli La risposta è che di solito Php lo capisce per te - uno dei vantaggi di un sistema di tipo dinamico.
Kolob Canyon,

12
Con tutte le catene di incertezza e 'di solito'.
persona27

2
@MatthieuNapoli In che modo il cast del tipo non è una "risposta reale"? Puoi anche controllare il tipo dopo aver digitato tipicamente se vuoi essere un bambino al riguardo
Kolob Canyon

3
@MatthieuNapoli Sono contento che tu abbia chiarito il tuo punto per dire che c'è più di un modo per scuoiare un gatto, piuttosto che non c'è modo di farlo. Il cast è molto importante nelle operazioni del database, ad esempio. Ad esempio in una query PDO con parametri, a volte ci sarà una lotta per il parser per rendersi conto che è un numero e non una stringa, quindi si finisce con uno 0 in un campo intero perché non è stato eseguito il cast della stringa in un int nel passaggio dei parametri.
Stubsthewizard,

Risposte:


1032

In genere non è necessario farlo, poiché PHP forzerà il tipo per te nella maggior parte dei casi. Per le situazioni in cui desideri convertire esplicitamente il tipo, esegui il cast :

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

4
qui la situazione è leggermente diversa Voglio convertire qualsiasi stringa (contiene solo numeri) in un numero generale. Come U può sapere in javaScript, possiamo usare parseInt () per convertire string => int o parseFloat () per convertire string => float. ma in generale javaScript usa Number () per convertire string => number. Voglio un metodo simile in php?
Sara,

4
Mi è stato utile quando avevo ottenuto un numero di mese da una stringa di data completa, che utilizzavo per estrarre un valore da un array di nomi di falene. Il casting automatico non avviene qui perché gli indici di stringa sono validi, ma non equivalenti.
Cazuma Nii Cavalcanti,

19
A seconda del contesto, potrebbe non essere sicuro supporre che .sia il separatore del punto decimale. en.wikipedia.org/wiki/…
Dave Jarvis,

3
@Sara: puoi anche creare una funzione per convertire la stringa in numero lanciandola prima in numero intero, quindi in float e confrontando se entrambi i valori (intero e float) sono uguali. In tal caso, è necessario restituire il valore come intero, in caso contrario, come float. Spero che tu abbia l'idea.
Youstay Igo,

2
Ci sono volte in cui devi passare l'intero al file system, non è una buona idea aspettare che PHP faccia la conversione per te.
AaA

173

Ci sono alcuni modi per farlo:

  1. Trasmetti le stringhe a tipi di dati primitivi numerici:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  2. Esegui operazioni matematiche sulle stringhe:

    $num = "10" + 1;
    $num = floor("10.1");
    
  3. Usa intval()o floatval():

    $num = intval("10");
    $num = floatval("10.1");
    
  4. Usa settype().


9
Si noti che (double)è solo un alias per (float).
ingannare

4
@downvoter, non so cosa c'è che non va nella mia risposta. Si noti che l'ho pubblicato prima che OP modificasse la sua domanda, tuttavia questo riguarda anche la domanda modificata ( $num = "10" + 1esempio).
Fardjad,

2
@ ed-ta: abbastanza sicuro che restituirà il valore min / max invece di 0 se gli passi le stringhe. Vale a dire intval("9999999999")==2147483647.
riv

6
intvalè utile perché poi puoi usarlo in array_map('intval', $arrayOfStrings);cui non puoi fare con il casting.
icc97,

2
invece $num = "10" + 1;che è meglio usare $num = "10" * 1;poiché non cambierà il valore (elemento neutro di moltiplicazione), questo è essenzialmente qualcosa di simile toNumber(..)poiché il tipo finale sarà determinato da ciò che è necessario per convertire la stringa "10" -> (int) 10; "10.1" -> (float) 10.1;
Holly

57

Per evitare problemi, prova intval($var). Qualche esempio:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

4
IMHO, questa è l'unica risposta corretta perché è l'unica che prende in considerazione la radice della stringa numerica. Tutte le risposte (anche quelle che suggeriscono una funzione definita dall'utente) che usano semplicemente un cast di tipo falliranno se la stringa numerica ha uno o più zeri iniziali e la stringa NON è intesa come un numero con una base ottale.
Sintassi Junkie,

qualche idea se voglio convertire "12.7896" in 12.7896?
Agnes Palit,

usa floatval () per convertire una stringa in un float. floatval ("12.7896") restituirà 12.7896
gopeca il

Perché questa non è la risposta accettata? Come outsider di PHP sapevo già che (int)$my_strnon avrebbe funzionato dal momento che avevo a che fare specificamente con le stringhe 01e 013che volevo interpretare come base 10 ... Quindi volevo un modo per fornire esplicitamente la base.
Giacomo Alzetta,

48

In qualunque linguaggio (tipicamente impreciso) puoi sempre lanciare una stringa su un numero aggiungendo uno zero ad esso.

Tuttavia, ha molto poco senso in quanto PHP lo farà automaticamente al momento dell'utilizzo di questa variabile, e verrà comunque trasmesso su una stringa al momento dell'output.

Tieni presente che potresti voler mantenere i numeri tratteggiati come stringhe, perché dopo il lancio per fluttuare potrebbe essere cambiato in modo imprevedibile, a causa della natura dei numeri fluttuanti.


35
Esistono molte lingue in cui non è possibile eseguire il cast di una stringa in numero aggiungendo uno zero, di solito è considerato un errore piuttosto che un metodo valido di cast :).
Jan Špaček,

4
honzasp ha ragione, ad esempio in JavaScript typeof('123'+0)'string', perché '123'+0'1230'.
Oriol,

5
Nota, in PHP si consiglia di utilizzare la maggior parte delle volte i confronti di stile ===. Quindi, se confronterai i tuoi dati, può essere molto importante in che tipo sono archiviati.
Jonathon

Nota che aggiungendo uno zero non stai "lanciando" nel vero senso, in pratica stai convertendo.
CSᵠ

12
@oriol in javascript è necessario aggiungere il numero a zero 0+'123'per ottenere123
Timo Huovinen,

24

Puoi usare:

(int)(your value);

Oppure puoi usare:

intval(string)

cosa succede se il numero inserito è '2.3456' come ottengo 2.3456?
Sara,

6
la domanda riguarda anche i galleggianti.
taseenb

Mostrami 1 riga da OP dove dice float? prima di passare commenti e voti negativi guarda Original Post.
noobie-php,

2
L'esempio mostra float, chiede come convertire stringhe numeriche in valori numerici (float e numeri interi)
taseenb

In primo luogo verificare se il numero è un galleggiante con is_float, e se questo passa poi colato a con (float)anziché (int).
Martin van Driel,

24

Se vuoi ottenere un float per $value = '0.4', ma int per $value = '4', puoi scrivere:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

È un po 'sporco, ma funziona.


3
Forse meno sporco? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook,

4
@jchook Forse più sporco perché dipende dalle impostazioni locali, ad esempio '0,4' invece di '0.4'.
Nick Rice,

Buon punto. Suppongo che potresti usare al localeconv()['decimal_point']posto di '.'. Un vantaggio della strpossoluzione è che è quasi due volte più veloce di lanciare due volte.
jchook,

2
@jchook che si interrompe in casi simili 2.1e2, ha un punto decimale, ma il numero risultante è intero
Tomáš Blatný,

1
Basta usare l' +operatore di identità:, var_dump(+'0.4', +'4')ti dà un float e un int. php.net/manual/en/language.operators.arithmetic.php
tvanc

15

Puoi sempre aggiungere zero ad esso!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

Ho ricevuto questo errore A non well formed numeric value encountered. qualche idea?
Agnes Palit,

15

Invece di dover scegliere se convertire stringin into float, puoi semplicemente aggiungerne uno 0e PHP convertirà automaticamente il risultato in un tipo numerico.

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

13

In PHP puoi usare le intval(string) or floatval(string)funzioni per convertire stringhe in numeri.


4
no voglio un metodo comune. il che significa che se '5' => dovrebbe convertirsi in 5 e se '2.345' => dovrebbe convertirsi in 2.345.
Sara,

13

Sì, esiste un metodo simile in PHP, ma è così poco noto che raramente ne sentirai parlare. È un operatore aritmetico chiamato " identità ", come descritto qui:

Operatori aritmetici

Per convertire una stringa numerica in un numero, procedi come segue:

$a = +$a;

Attenzione: hack rilevato.
Greg,

Ciao @Greg. Hai fatto clic sul link pubblicato qui? Questo è ciò che gli sviluppatori hanno detto di questo operatore: conversione di $ a in int o float come appropriato. "Conversione", qui, non può essere intesa come una conversione da numero a numero. Perché? Perché da un esclusivo punto di vista aritmetico, questo operatore è assolutamente inutile! Moltiplicare qualsiasi numero per "+1" (l'equivalente della funzione identità) non ha assolutamente alcun effetto su di esso. Pertanto, non posso immaginare un'altra utilità per questo operatore oltre alla conversione del tipo suggerita qui.
aldemarcalazans,

@Greg - sicuramente questo è meno di un trucco, rispetto alla maggior parte delle altre risposte. È un operatore integrato, che fa esattamente ciò che è stato richiesto. (Anche se probabilmente è meglio verificare prima is_numeric, quindi trova un posto dove inserire il codice per gestire le stringhe che non possono essere convertite correttamente.)
ToolmakerSteve

Capisco che funzioni perfettamente per usare un operatore aritmetico per il casting, ma è davvero facile perdere. Penso che valga la pena avvertire.
Greg,

11

Solo una piccola nota alle risposte che possono essere utili e più sicure in alcuni casi. Potresti voler verificare se la stringa contiene prima un valore numerico valido e solo successivamente convertirlo in un tipo numerico (ad esempio se devi manipolare i dati provenienti da un db che converte ints in stringhe). È possibile utilizzare is_numeric()e quindi floatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

9

Ecco la funzione che realizza ciò che stai cercando. Per prima cosa controlliamo se il valore può essere compreso come un numero, in tal caso lo trasformiamo in un int e un float. Se int e float sono uguali (ad es. 5 == 5.0), restituiamo il valore int. Se int e float non sono uguali (ad es. 5! = 5.3) allora assumiamo che tu abbia bisogno della precisione del float e restituisca quel valore. Se il valore non è numerico, lanciamo un avviso e restituiamo null.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

6

Ho scoperto che in JavaScript un modo semplice per convertire una stringa in un numero è moltiplicarlo per 1. Risolve il problema di concatenazione, perché il simbolo "+" ha molteplici usi in JavaScript, mentre il simbolo "*" è puramente per moltiplicazione matematica.

Sulla base di ciò che ho visto qui in merito al fatto che PHP è automaticamente disposto a interpretare una stringa contenente cifre come un numero (e i commenti sull'aggiunta, poiché in PHP il "+" è puramente per l'aggiunta matematica), questo trucco moltiplica funziona perfettamente anche per PHP.

L'ho testato e funziona ... Anche se a seconda di come hai acquisito la stringa, potresti voler applicare la funzione trim () prima di moltiplicare per 1.


6

Ecco una funzione che ho scritto per semplificare le cose da solo:

Restituisce anche versioni abbreviate di booleano, intero, doppio e reale.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

La chiamata del tipo con parseNumeric impostato su true convertirà le stringhe numeriche prima di controllare il tipo.

Così:

type ("5", true) restituirà int

type ("3.7", true) restituirà float

digitare ("500") restituirà la stringa

Fai solo attenzione poiché si tratta di una sorta di metodo di controllo falso e la tua variabile effettiva sarà comunque una stringa. Sarà necessario convertire la variabile effettiva nel tipo corretto, se necessario. Ne avevo solo bisogno per verificare se il database dovesse caricare un id o un alias di elemento, quindi non avere effetti imprevisti poiché verrà comunque analizzato come stringa in fase di esecuzione.

modificare

Se desideri rilevare se gli oggetti sono funzioni aggiungi questo caso allo switch:

case 'object': return is_callable($mixed)?'function':'object';

6

Oltre alla risposta di Boykodev, suggerisco questo:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

Dopo averci pensato un po ', posso anche suggerire una divisione per 1 :)
Boykodev,

1
Questo è un punto! :) A proposito la tua soluzione è molto meglio di tutte le notazioni scientifiche sopra. Grazie.
droga

questa soluzione ha risolto il mio problema. Nel mio caso, $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;invece di $ target_id_cron = (int) $ id_cron - 1;
inMILD

1
Ho ricevuto questo errore A non well formed numeric value encounteredquando voglio cambiare la stringa in float $num = '12,24' * 1. Qualche suggerimento?
Agnes Palit,

5
$a = "10";

$b = (int)$a;

Puoi usarlo per convertire una stringa in un int in PHP .


2
se il numero inserito è '7.2345' non posso usare (int) quindi devo usare (float). Ciò di cui ho bisogno è una soluzione generale.
Sara,

1
Puoi sempre usare double o float.
Pritom,

5

Semplicemente puoi scrivere così:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

3
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
Alex Riabov,

1
Sei sicuro di questo? Questo non converte una stringa in un numero, ma un array in una stringa JSON
Nico Haase,

Sì, @NicoHaase se il numero è in formato stringa in un array, verrà convertito in un numero.
Dominic Amal Joe F,

5

Moltiplica il numero solo per 1 in modo che la stringa venga convertita nel tipo numero.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

Abbastanza giusto, ma questo metodo (e trucchi simili) sono già elencati nelle altre 24 risposte a questa domanda - non vedo il valore nel postarlo di nuovo.
DavidW,

4

Puoi usare:

((int) $var)   ( but in big number it return 2147483647 :-) )

Ma la soluzione migliore è usare:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

O

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

2

È possibile modificare il tipo di dati come segue

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

Per motivi storici "double" viene restituito in caso di float.

Documentazione PHP


2

Tutti i suggerimenti perdono il tipo numerico.

Questa mi sembra una buona pratica:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}

1

PHP lo farà per te entro certi limiti

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>

Non voglio dirlo. Voglio convertirlo e salvarlo in una variabile.
Sara,

1
Questo automaticamente lo ha convertito in un galleggiante. La conversione di tipo loose di PHP fa per te. Anche se potrebbe non fare quello che ti aspetti, le altre risposte con conversione esplicita potrebbero funzionare meglio per te.
Adrian Cornish,

$ str può contenere '5' o '5.258' usando printf ("% f \ n", $ str) '5' uscirà come 5.000000 (lo voglio come 5) per 5.280000 (lo voglio come 5.28) contiene più punti decimali.
Sara,

1

C'è un modo:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

Utilizzando is_*non funziona, dal momento che la variableè una: string.

Utilizzando la combinazione di json_encode()e quindi json_decode()viene convertito nella sua forma "vera". Se è un vero, stringallora avrebbe prodotto un errore.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

Uscita: string(2) "Me" int(0) float(0)


0

Ho avuto la domanda "diciamo che stavi scrivendo la funzione integrata per trasmettere un numero intero a una stringa in PHP, come scriveresti quella funzione" in un'intervista di programmazione. Ecco una soluzione

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

0

Ho letto le risposte e non ho visto nessuno menzionare il più grande avvertimento nella conversione numerica di PHP.

La risposta più votata suggerisce di fare quanto segue:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

È geniale. PHP dirige il casting. E se avessimo fatto quanto segue?

$str = "3.14is_trash"
$intstr = (int)$str

PHP considera tali conversioni valide?

A quanto pare .

PHP legge la stringa fino a quando non trova il primo carattere non numerico per il tipo richiesto. Ciò significa che per i numeri interi, i caratteri numerici sono [0-9]. Di conseguenza, legge 3, poiché si trova nell'intervallo di caratteri [0-9], continua a leggere. Legge .e si ferma lì poiché non è compreso nell'intervallo [0-9].

Lo stesso accadrebbe se si lanciasse per float o double. PHP leggerebbe 3, quindi ., quindi 1, quindi 4, e si fermerebbe a ipoiché non è un carattere numerico float valido.

Di conseguenza, "million" >= 1000000restituisce false, ma "1000000million" >= 1000000valuta true.

Guarda anche:

https://www.php.net/manual/en/language.operators.comparison.php come vengono eseguite le conversioni durante il confronto

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion come le stringhe vengono convertite in rispettivi numeri


0

Se non sai in anticipo se hai un float o un numero intero
e se la stringa può contenere caratteri speciali (come spazio, €, ecc.)
E se può contenere più di 1 punto o virgola,
puoi usare questo funzione:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

-8

Approccio diverso:

  1. Inserire tutto in un array / array associativo.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); eventualmente decodificarlo indietro
  3. ?
  4. Profitto!

7
Stack Overflow riguarda le risposte alle domande, non le battute. Sono sicuro che c'è un posto là fuori per quello, ma questo posto non lo è.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.