Questa funzione fa il lavoro per il 99% del tempo per ogni ingresso si gettano in:
function($number) {
(float)(int)$number == (float)$number;
}
Nota: Confronto Strict non è davvero necessario qui, perché quando si esegue il casting su (float) entrambi sono sempre dello stesso tipo.
Ispirato this article about PHP insanity quando si confrontano valori, ho fatto un piccolo test per i seguenti ingressi:
Come previsto
Questi valori non hanno una parte frazionaria:
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
Questi valori do hanno una parte frazionaria:
'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
non ci si aspetta:
'8e2bottles' // FALSE
Come spiegato in questo articolo, questo valore farà cose folli e fallirà anche nella mia funzione. È perché il casting su int
e float
fornisce un valore totale diverso. Quindi preparati!
(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
Solo una nota, PHP è estremamente flessibile con stringhe e numeri (e stringhe che sembrano numeri). Molti lo considerano ** troppo ** flessibile.Se questo è di qualsiasi importanza, non posso sottolineare abbastanza la necessità di testare accuratamente il tuo script. – jedwards
Giusto per essere chiari: un numero intero è sempre un numero intero. Quello che probabilmente intendi è verificare se una "stringa" o "float" ha una "parte frazionaria" o meno. – Daan