¿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

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;

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().


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
?>

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.


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)

¿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.


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)

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;

13

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


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;

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

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

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.


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

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)

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 .


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);
?>

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

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;

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


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

1

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

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

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

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)


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

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


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

-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!

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.