Esta función hace el trabajo para el 99% de las veces para cada entrada se lanza en:
function($number) {
(float)(int)$number == (float)$number;
}
Nota: comparación estricta no es realmente necesario aquí, porque cuando se lanza a (flotante) ambos son siempre del mismo tipo.
Inspirado por this article about PHP insanity al comparar los valores, me encontré con una pequeña prueba para las siguientes entradas:
Como era de esperar
Estos valores hacer no tienen una parte fraccionaria:
1.0 // TRUE
'1.0' // TRUE
true // TRUE
false // TRUE
'true' // TRUE
'false' // TRUE
10e3 // TRUE
// TRUE
null // TRUE
'test' // TRUE
1 // TRUE
0 // TRUE
1.2e3 // TRUE
0xfe // TRUE
0b0 // TRUE
0b1 // TRUE
b0 // TRUE
b1 // TRUE
-0xfe // TRUE
'' // TRUE
'8bottles' // TRUE
'8.0bottles' // TRUE
'0foo' // TRUE
array() // TRUE
'0x12foo' // TRUE
'0123' // TRUE
'0xfe' // TRUE
new Object // TRUE
Estos valores do tienen una parte fraccionaria:
'1.1' // FALSE
1.1 // FALSE
10e-3 // FALSE
.9 // FALSE
0.9 // FALSE
.1 // FALSE
0.1 // FALSE
0123.2 // FALSE
7E-10 // FALSE
1.2e-3 // FALSE
no se esperaba:
'8e2bottles' // FALSE
Como se explica en el artículo, este valor va a hacer cosas locas y también se producirá un error en mi función. Es porque el lanzamiento a int
y float
da un valor total diferente. ¡Asi que preparate!
(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
Solo una nota, PHP es extremadamente flexible con cadenas y números (y cadenas que parecen números). Muchos lo consideran ** demasiado ** flexible.Si esto tiene algún tipo de importancia, no puedo dejar de insistir en la necesidad de probar a fondo tu guión. – jedwards
Para que quede claro: un número entero es siempre un número entero. Lo que probablemente quiera decir es que compruebe si una "cadena" o "flotante" tiene una "parte fraccionaria" o no. – Daan