numerico - convertir string a int php
La comparación de cadena a entero da resultados extraños (5)
Después de un poco de investigación, resulta que aidan del manual de PHP mencionado que cualquier cadena que no empiece con un número se convertirá a 0 cuando se convierte como un entero.
Esto significa que:
("php" == 0) === true
("1php" == 0) === false
Muy molesto y no bien documentado. Estaba en la parte inferior de los comentarios en la página de comparación de tipos.
Estoy realmente confundido sobre por qué funciona esta operación. ¿Alguien puede explicarlo?
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";
if ($test1 == 0)
echo "Test 1 is Equal!?";
if ($test2 == 0)
echo "Test 2 is Equal!?";
// Returns: Test 1 is Equal!?
Para aclarar, estoy tratando de comparar la cadena "0"
con las variables de $test
. Ya sé que para corregir el código puedo encerrar (como debería) el 0
en ""
s
Me pregunto si esto es un error de PHP, un error del servidor o, de alguna manera, una operación válida. De acuerdo con http://us3.php.net/types.comparisons esto no debería haber funcionado.
Editar: rayar eso, aparentemente menciona que las comparaciones sueltas entre cadena y 0 son verdaderas. Pero todavía no sé por qué.
Editar 2: he revisado mi pregunta, ¿por qué el valor $test2
de "3581169b064f71be1630b321d3ca318f"
no funciona?
He estado usando algunas conversiones y comparaciones para probar si una cadena numérica es un número:
$test1="19de6a91d2ca9d91721d82f1bd8102b6";
echo (float)$test1==$test1; //TRUE
echo is_float($test1); //FALSE
//Converting the string to float and then converting it to string and compare will do the trick
echo (string)((float)$test1)==(string)$test1; //FALSE
$test2="5.66";
echo (float)$test2==$test2; //TRUE
//Testing the numeric string using `is_float` wont give the expected result
echo is_float($test2); //FALSE
echo (string)((float)$test2)==(string)$test2; //TRUE
Conversión de cadenas a números
Cuando se evalúa una cadena en un contexto numérico, el valor y el tipo de letra resultante se determinan de la siguiente manera.
La cadena se evaluará como un flotante si contiene alguno de los caracteres ''.'', ''E'' o ''E''. De lo contrario, se evaluará como un número entero.
El valor viene dado por la porción inicial de la cadena. Si la cadena comienza con datos numéricos válidos, este será el valor utilizado. De lo contrario, el valor será 0 (cero). Los datos numéricos válidos son un signo opcional, seguido de uno o más dígitos (que contienen opcionalmente un punto decimal), seguidos por un exponente opcional. El exponente es una ''e'' o ''E'' seguidas por uno o más dígitos.
Conversión tipo con el operador ==
El operador == es una comparación sin tipeo. Convertirá ambos en un tipo común y los comparará. Aquí se explica cómo se convierten las cadenas a enteros.
Tenga en cuenta que la http://us3.php.net/types.comparisons no lo contradice. Verifique la segunda tabla, donde dice que comparar el número entero 0
con una cadena "php"
usando ==
será verdadero.
Lo que sucede es que la cadena se convierte en entero, y las cadenas no numéricas (cadenas que no contienen o comienzan con un número) se convierten en 0
.
Cadenas numéricas vs no numéricas
Una cadena que consiste en un número, o comienza con un número, se considera una cadena numérica . Si la cadena tiene otros caracteres después de ese número, estos se ignoran.
Si una cadena comienza con un carácter que no se puede interpretar como parte de un número, entonces es una cadena no numérica y se convertirá en 0
. Esto no significa que una cadena numérica tenga que comenzar con un dígito (0-9); por ejemplo, "-1"
es una cadena numérica porque el signo menos es parte de un número en ese caso.
Por ejemplo, su cadena "d85d1d81b25614a3504a3d5601a9cb2e"
no comienza con un número, por lo que se convertiría en 0
. Pero su segunda cadena "3581169b064f71be1630b321d3ca318f"
se convertiría en el número entero 3581169
. Es por eso que su segunda prueba no funciona de la misma manera.
Qué deberías hacer
Probablemente quieras:
if ($test1 === "0")
Observe el uso de triple equals en lugar de doble equals. Esto asegura que lo que está comparando es una cadena que contiene el dígito cero solamente, y evita cualquier tipo de conversión.
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
esta cadena comienza con una "d", que no es un número válido, la var se resolverá en 0 y su prueba n. ° 1 pasará.
$test2 = "3581169b064f71be1630b321d3ca318f";
esta cadena comienza con 3581169, que es un número válido, por lo que la var se resolverá con un valor que no sea igual a 0. Por lo tanto, su prueba n. ° 2 no pasará.