¿Cómo convierto una cadena a un número en PHP?

671

Quiero convertir estos tipos de valores, '3', '2.34', '0.234343', etc, para un número. En JavaScript podemos usar Number(), pero ¿hay algún método similar disponible en PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
Sara
fuente
63
Cuidado con el lector: no hay una respuesta real a esta pregunta :(
Matthieu Napoli
@MatthieuNapoli La respuesta es que, por lo general, Php lo descubre por usted, una de las ventajas de un sistema de tipo dinámico.
Kolob Canyon
12
Con todas las cadenas de incertidumbre y 'generalmente'.
persona27
2
@MatthieuNapoli ¿Cómo es la conversión de tipos no una "respuesta real"? Incluso puedes verificar el tipo después de escribirlo si quieres ser un bebé al respecto
Kolob Canyon
3
@MatthieuNapoli Me alegra que haya aclarado su punto de vista de que hay más de una forma de desollar a un gato, en lugar de que no haya forma de hacerlo. El casting es muy importante en las operaciones de la base de datos, por ejemplo. Por ejemplo, en una consulta PDO parametrizada, a veces el analizador tendrá dificultades para darse cuenta de que es un número y no una cadena, y luego terminará con un 0 en un campo entero porque no echó la cadena a un int en el paso del parámetro
stubsthewizard

Respuestas:

1033

Por lo general, no necesita hacer esto, ya que PHP forzará el tipo por usted en la mayoría de las circunstancias. Para situaciones en las que desea convertir explícitamente el tipo, transmítalo :

$num = "3.14";
$int = (int)$num;
$float = (float)$num;
difunto
fuente
44
aquí la situación es un poco diferente. Quiero convertir cualquier cadena (contiene solo números) a un número general. Como U puede saber en javaScript, podemos usar parseInt () para convertir string => int o parseFloat () para convertir string => float. pero en general, javaScript usa Number () para convertir string => number. Quiero un método similar en php?
Sara
44
Fue útil para mí cuando tenía un número de mes obtenido de una cadena de fecha completa, que solía extraer un valor de una matriz de nombres de polillas. La conversión automática no ocurre aquí porque los índices de cadena son válidos, pero no equivalentes.
Cazuma Nii Cavalcanti
19
Dependiendo del contexto, puede que no sea seguro asumir que .es el separador de punto decimal. en.wikipedia.org/wiki/…
Dave Jarvis
3
@Sara: También puede crear una función para convertir la cadena en número convirtiéndola primero en entero, luego en flotante y luego comparando si ambos valores (entero y flotante) son iguales. Si lo son, debe devolver el valor como entero, si no, como flotante. Espero que tengas la idea.
Youstay Igo
2
Hay veces que necesita pasar el número entero al sistema de archivos, no es una buena idea esperar a que PHP haga la conversión por usted.
AaA
173

Hay algunas formas de hacerlo:

  1. Convierta las cadenas en tipos de datos primitivos numéricos:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
  2. Realice operaciones matemáticas en las cadenas:

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

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

Fardjad
fuente
99
Tenga en cuenta que (double)es solo un alias para (float).
deceze
44
@downvoter, no sé qué tiene de malo mi respuesta. Tenga en cuenta que publiqué esto antes de que OP editara su pregunta, sin embargo, esto también cubre la pregunta editada ( $num = "10" + 1ejemplo).
fardjad
2
@ ed-ta: bastante seguro de que devolverá el valor mínimo / máximo en lugar de 0 si le pasa cadenas. Es decir intval("9999999999")==2147483647.
riv
66
intvales útil porque luego puedes usarlo en array_map('intval', $arrayOfStrings);lo que no puedes hacer con el casting.
icc97
2
en lugar de $num = "10" + 1;que sea mejor usarlo, $num = "10" * 1;ya que eso no cambiará el valor (elemento neutral de multiplicación), esto es esencialmente algo así toNumber(..)ya que el tipo final estará determinado por lo que se necesita para convertir la cadena "10" -> (int) 10; "10.1" -> (flotante) 10.1;
Holly
57

Para evitar problemas intente intval($var). Algunos ejemplos:

<?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
?>
gopeca
fuente
44
En mi humilde opinión, esta es la única respuesta correcta porque es la única que tiene en cuenta la raíz de la cadena numérica. Todas las respuestas (incluso aquellas que sugieren una función definida por el usuario) que simplemente usan un tipo de conversión fallarán si la cadena numérica tiene uno o más ceros a la izquierda, y la cadena NO está pensada como un número con una base octal.
Syntax Junkie
alguna idea si quiero convertir "12.7896" a 12.7896?
Agnes Palit
use floatval () para convertir una cadena en un flotador. floatval ("12.7896") devolverá 12.7896
gopeca
¿Por qué no es esta la respuesta aceptada? Como un extraño de PHP, ya sabía que eso (int)$my_strno funcionaría, ya que estaba tratando específicamente con me gusta de cadenas 01y 013que quiero interpretar como base 10 ... Entonces, quería una forma de proporcionar explícitamente la base.
Giacomo Alzetta
48

En cualquier lenguaje (tipeado) siempre puede convertir una cadena a un número agregando un cero.

Sin embargo, tiene muy poco sentido en esto, ya que PHP lo hará automáticamente al momento de usar esta variable, y de todos modos se convertirá en una cadena al momento de la salida.

Tenga en cuenta que es posible que desee mantener los números punteados como cadenas, porque después de emitir para flotar puede cambiar de forma impredecible, debido a la naturaleza de los números flotantes.

Su sentido común
fuente
35
Hay muchos idiomas en los que no puede convertir una cadena a un número agregando un cero, por lo general se considera un error en lugar de un método válido de conversión :).
Jan Špaček
44
honzasp tiene razón, por ejemplo, en JavaScript typeof('123'+0)da 'string', porque '123'+0da '1230'.
Oriol
55
Tenga en cuenta que en PHP se recomienda que la mayoría de las veces use comparaciones de estilo ===. Entonces, si va a comparar sus datos, puede ser muy importante en qué tipo se almacena.
Jonathon
Tenga en cuenta que al agregar un cero no está 'lanzando' en el verdadero sentido, básicamente está convirtiendo.
CSᵠ
12
@oriol en javascript necesita agregar el número a cero 0+'123'para obtener123
Timo Huovinen
24

Puedes usar:

(int)(your value);

O puedes usar:

intval(string)
noobie-php
fuente
¿Qué pasa si el número ingresado es '2.3456', cómo obtengo 2.3456?
Sara
66
La pregunta es también sobre flotadores.
taseenb
Muéstrame 1 línea de OP donde dice flotante? Antes de pasar comentarios y votos negativos, mire la publicación original.
noobie-php
2
El ejemplo muestra flotantes, pregunta cómo convertir cadenas numéricas en valores numéricos (flotantes y enteros)
taseenb
Primero verifique si el número es flotante con is_float, y si eso pasa, luego eche a con en (float)lugar de (int).
Martin van Driel el
24

Si quieres obtener un float para $value = '0.4', pero int para $value = '4', puedes escribir:

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

Está un poco sucio, pero funciona.

Aleksei Akireikin
fuente
3
¿Posiblemente menos sucio? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook
44
@jchook Posiblemente más sucio porque depende de la configuración regional, por ejemplo, '0,4' en lugar de '0.4'.
Nick Rice
Buen punto. Supongo que podrías usar en localeconv()['decimal_point']lugar de '.'. Una ventaja de la strpossolución es que es casi 2 veces más rápido que lanzar dos veces.
jchook
2
@jchook que se rompe en casos como 2.1e2, tiene punto decimal, pero el número resultante es entero
Tomáš Blatný
1
Simplemente use el +operador de identidad:, var_dump(+'0.4', +'4')le da un flotante y un int. php.net/manual/en/language.operators.arithmetic.php
tvanc
15

¡Siempre puedes agregarle cero!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)
Boykodev
fuente
Tengo este error A non well formed numeric value encountered. ¿alguna idea?
Agnes Palit
15

En lugar de tener que elegir si desea convertir el stringa into float, simplemente puede añadir una 0a ella, y PHP convertirá automáticamente el resultado a un tipo numérico.

// 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;
webNeat
fuente
13

En PHP puedes usar intval(string) or floatval(string)funciones para convertir cadenas en números.

Kashif Khan
fuente
44
No, quiero un método común. lo que significa que si su '5' => debería convertirse a 5 y si su '2.345' => debería convertirse a 2.345.
Sara
13

Sí, hay un método similar en PHP, pero es tan poco conocido que rara vez lo escuchará. Es un operador aritmético llamado " identidad ", como se describe aquí:

Operadores Aritméticos

Para convertir una cadena numérica en un número, haga lo siguiente:

$a = +$a;
aldemarcalazans
fuente
Advertencia: hack detectado.
Greg
Hola Greg. ¿Hiciste clic en el enlace publicado aquí? Esto es lo que los desarrolladores dijeron sobre este operador: Conversión de $ a a int o float según corresponda. "Conversión", aquí, no puede entenderse como una conversión de número a número. ¿Por qué? ¡Porque desde un punto de vista aritmético exclusivo, este operador es absolutamente inútil! Multiplicar cualquier número por "+1" (el equivalente de la función de identidad) no tiene absolutamente ningún efecto sobre él. Por lo tanto, no puedo imaginar otra utilidad para este operador que la conversión de tipo sugerida aquí.
aldemarcalazans
@Greg: seguramente esto es menos hackeo que la mayoría de las otras respuestas. Es un operador incorporado, que hace exactamente lo que se solicitó. (Aunque probablemente lo mejor sea primer cheque is_numeric, por lo que tener un lugar para poner el código en cadenas de mango que no se puede convertir correctamente.)
ToolmakerSteve
Entiendo que funciona perfectamente usar un operador aritmético para lanzar, pero es muy fácil pasarlo por alto. Creo que vale la pena una advertencia.
Greg
11

Solo una pequeña nota a las respuestas que puede ser útil y más segura en algunos casos. Es posible que desee verificar si la cadena realmente contiene un valor numérico válido primero y solo luego convertirlo a un tipo numérico (por ejemplo, si tiene que manipular los datos que provienen de una base de datos que convierte ints en cadenas). Puede usar is_numeric()y luego floatval():

$a = "whatever"; // any variable

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

Aquí está la función que logra lo que está buscando. Primero verificamos si el valor puede entenderse como un número, si es así lo convertimos en un int y un flotante. Si int y float son iguales (p. Ej., 5 == 5.0) entonces devolvemos el valor int. Si int y float no son lo mismo (por ejemplo, 5! = 5.3), entonces asumimos que necesita la precisión del float y devolver ese valor. Si el valor no es numérico, lanzamos una advertencia y devolvemos nulo.

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;
    }
}
CogSciGradStudent
fuente
6

Descubrí que en JavaScript una manera simple de convertir una cadena en un número es multiplicarla por 1. Resuelve el problema de concatenación, porque el símbolo "+" tiene múltiples usos en JavaScript, mientras que el símbolo "*" es puramente para multiplicación matemática

Basado en lo que he visto aquí con respecto a que PHP está dispuesto a interpretar automáticamente una cadena que contiene dígitos como un número (y los comentarios sobre la suma, ya que en PHP el "+" es puramente para la suma matemática), este truco de multiplicación funciona bien para PHP, también.

Lo he probado y funciona ... Aunque dependiendo de cómo adquirió la cadena, es posible que desee aplicarle la función trim (), antes de multiplicar por 1.

vernonner3voltazim
fuente
6

Aquí hay una función que escribí para simplificar las cosas para mí:

También devuelve versiones abreviadas de boolean, integer, double y real.

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;
    }
}

El tipo de llamada con parseNumeric establecido en verdadero convertirá cadenas numéricas antes de verificar el tipo.

Así:

tipo ("5", verdadero) devolverá int

tipo ("3.7", verdadero) devolverá flotante

type ("500") devolverá una cadena

Solo tenga cuidado ya que este es un tipo de método de verificación falsa y su variable real seguirá siendo una cadena. Necesitará convertir la variable real al tipo correcto si es necesario. Solo lo necesitaba para verificar si la base de datos debería cargar una identificación o alias de elemento, por lo que no tiene ningún efecto inesperado, ya que de todos modos se analizará como una cadena en tiempo de ejecución.

Editar

Si desea detectar si los objetos son funciones, agregue este caso al conmutador:

case 'object': return is_callable($mixed)?'function':'object';
Dieter Gribnitz
fuente
6

Además de la respuesta de Boykodev, sugiero esto:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)
drogo
fuente
Después de pensar un poco en esto, también puedo sugerir la división por 1 :)
Boykodev
1
¡Ese es el punto! :) Por cierto, su solución es mucho mejor que todas las anotaciones científicas anteriores. Gracias.
drugan
Esta solución resolvió mi problema. En mi caso, en $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;lugar de $ target_id_cron = (int) $ id_cron - 1;
inMILD
1
Recibí este error A non well formed numeric value encounteredcuando quiero cambiar la cadena para flotar $num = '12,24' * 1. ¿Cualquier sugerencia?
Agnes Palit
5
$a = "10";

$b = (int)$a;

Puede usar esto para convertir una cadena a un int en PHP .

Pritom
fuente
2
si el número ingresado es '7.2345' no puedo usar (int), entonces tengo que usar (float). Lo que necesito es una solución general.
Sara
1
Siempre puedes usar doble o flotante.
Pritom
5

Simplemente puedes escribir así:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>
Dominic Amal Joe F
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a por qué y / o cómo responde la pregunta mejora su valor a largo plazo.
Alex Riabov
1
¿Estas seguro acerca de esto? Esto no convertirá una cadena en un número, sino una matriz en una cadena JSON
Nico Haase
Sí, @NicoHaase si el número está en formato de cadena en una matriz, se convertirá en un número.
Dominic Amal Joe F
5

Solo multiplique el número por 1 para que la cadena se convierta en número de tipo.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}
rolodef
fuente
Es justo, pero este método (y trucos similares) ya se enumeran en las otras 24 respuestas a esta pregunta: no veo el valor en publicarlo nuevamente.
DavidW
4

Puedes usar:

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

Pero la mejor solución es usar:

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;
Mehdi Ajdari
fuente
2

Puede cambiar el tipo de datos de la siguiente manera

$number = "1.234";

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

settype($number , "float");

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

Por razones históricas, se devuelve "doble" en caso de flotación.

Documentación PHP

David Lozano
fuente
2

Todas las sugerencias pierden el tipo numérico.

Esto me parece una mejor práctica:

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";
}
Rocco Galasso
fuente
1

PHP lo hará por ti dentro de los límites

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

   printf("%f\n", $num);
?>
Adrian Cornish
fuente
No quiero sacarlo. Quiero convertirlo y guardarlo en una variable.
Sara
1
Esto lo convirtió automáticamente en un flotador. La conversión de tipo suelto de PHP lo hace por usted. Aunque puede que no haga lo que espera, las otras respuestas con conversión explícita pueden funcionar mejor para usted.
Adrian Cornish
$ str puede contener '5' o '5.258' usando printf ("% f \ n", $ str) '5' saldrá como 5.000000 (lo quiero como 5) para 5.280000 (lo quiero como 5.28) contiene Más puntos decimales.
Sara
1

Hay una manera:

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

Usar is_*no funcionará, ya que variablees un:string .

Usando la combinación de json_encode()y luego json_decode()se convierte a su forma "verdadera". Si es cierto, stringentonces saldría mal.

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

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

Saldrá: string(2) "Me" int(0) float(0)

Anuga
fuente
0

Recibí la pregunta "digamos que estaba escribiendo la función incorporada para convertir un número entero en una cadena en PHP, ¿cómo escribiría esa función" en una entrevista de programación. Aquí hay una solución.

$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);
Brendan
fuente
0

He estado leyendo las respuestas y no vi a nadie mencionar la mayor advertencia en la conversión de números de PHP.

La respuesta más votada sugiere hacer lo siguiente:

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

Eso es brillante. PHP hace casting directo. Pero, ¿y si hiciéramos lo siguiente?

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

¿PHP considera válidas tales conversiones?

Aparentemente si .

PHP lee la cadena hasta que encuentra el primer carácter no numérico para el tipo requerido. Lo que significa que para los enteros, los caracteres numéricos son [0-9]. Como resultado, se lee 3, ya que está en el rango de caracteres [0-9], continúa leyendo. Lee. y se detiene allí ya que no está en el rango [0-9].

Lo mismo sucedería si lanzaras para flotar o duplicar. PHP leería 3, luego ., luego 1, luego 4, y se detendría iya que no es un carácter numérico flotante válido.

Como resultado, se "million" >= 1000000evalúa como falso, pero se "1000000million" >= 1000000evalúa como true.

Ver también:

https://www.php.net/manual/en/language.operators.comparison.php cómo se realizan las conversiones al comparar

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion cómo las cadenas se convierten en números respectivos

Dragas
fuente
0

Si no sabe de antemano si tiene un flotante o un entero,
y si la cadena puede contener caracteres especiales (como espacio, €, etc.),
y si puede contener más de 1 punto o coma,
puede usar esto función:

// 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;
}
usuario1657853
fuente
-8

Enfoque diferente:

  1. Empújalo todo en una matriz / matriz asociativa.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); opcionalmente decodificar de nuevo
  3. ?
  4. ¡Lucro!
Peter Mortensen
fuente
77
Stack Overflow se trata de respuestas a preguntas, no de bromas. Estoy seguro de que hay un lugar para eso, pero este lugar no lo es.