Funkcja ta ma zadanie do 99% czasu dla każdego wejścia rzucasz w:
function($number) {
(float)(int)$number == (float)$number;
}
Uwaga: Ścisłe porównanie nie jest naprawdę konieczne tutaj, ponieważ podczas rzucania do (float) oba są zawsze tego samego typu.
Zainspirowany this article about PHP insanity przy porównywaniu wartości, wpadłem mały test dla następujących wejść:
jak oczekiwano
Te wartości nie mieć część ułamkową:
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
Te wartości do mają ułamkową część:
'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
Nie oczekuje:
'8e2bottles' // FALSE
Jak wyjaśniono w artykule, wartość ta będzie robić szalone rzeczy, a także nie w mojej funkcji. Dzieje się tak dlatego, że rzutowanie na int
i float
daje całkowitą inną wartość. Więc bądź przygotowany!
(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
Po prostu uwaga, PHP jest bardzo elastyczny w odniesieniu do łańcuchów i liczb (i ciągów, które wyglądają jak cyfry). Wielu uważa to za zbyt elastyczne.Jeśli ma to jakiekolwiek znaczenie, nie mogę wystarczająco podkreślić konieczności dokładnego przetestowania twojego skryptu. – jedwards
Po prostu, aby było jasne: liczba całkowita jest zawsze liczbą całkowitą. Prawdopodobnie chodzi o sprawdzenie, czy "ciąg" lub "unoszący się" ma "część ułamkową", czy też nie. – Daan