2012-03-05 8 views
5

W PHP wygląda na to, że każdy obiekt można przekonwertować na liczbę całkowitą, po prostu wywołując intval($object), ale to nie jest to, czego chcę. Chcę tylko, aby obiekt był prawidłowy do przekształcenia w liczbę całkowitą dla tego, o czym myśli człowiek.PHP sprawdza, czy obiekt można przekonwertować na liczbę całkowitą?

Tj, ważne obiekty byłyby

  • 12
  • 12.0
  • "12"
  • "12.0"

I nie ważne byłoby

  • MyFooInstance()
  • "some string"
  • "12.0.0"
  • "0 12.0"

itp W python, mogłem po prostu na następujące kwestie:

try: 
    int(var) 
except (TypeError, ValueError): 
    return False 
return True 

Jak mogę achive to w PHP?

+1

[Zachowanie konwersji ** obiektów ** na liczbę całkowitą jest niezdefiniowane.] (Http://php.net/manual/en/language.types.integer.php#language.types.integer.casting) – Gordon

+0

Go z Dogbertem i polecam Gordonowi –

Odpowiedz

8

Użyj is_numeric.

<?php 
$tests = array(
    "42", 
    1337, 
    "1e4", 
    "not numeric", 
    array(), 
    9.1 
); 

foreach ($tests as $element) { 
    if (is_numeric($element)) { 
     echo "'{$element}' is numeric", PHP_EOL; 
    } else { 
     echo "'{$element}' is NOT numeric", PHP_EOL; 
    } 
} 
?> 


'42' is numeric 
'1337' is numeric 
'1e4' is numeric 
'not numeric' is NOT numeric 
'Array' is NOT numeric 
'9.1' is numeric 

(ze strony)

+0

Dziękuję, musiałeś tego nie zauważyć! –

-1

spróbować tej

if((int)$variable) {... 
+1

Warunek w 'if ((int) $ zmienna)' zostałby obliczony na 'false' gdy '$ variable == 0'. –

+0

tak, zapomniałem tego "małego" szczegółu :) –

3

Integer (nie tylko numeryczna) Test:

function is_integerable($v){ 
    return is_numeric($v) && +$v === (int)(+$v); 
} 

Wyniki:

$str => is_integerable($str) 
'-1' => true 
'-1.00' => true 
'-1.11' => false 
'1e4' => true 
'1e40' => false 

zobacz:

http://codepad.org/LoqfAgNl

+0

Bardzo dziękuję, ale "is_numeric" również pasuje. :) –

1

See PHP ctype_digit().

Ta funkcja analizuje ciąg, aby sprawdzić, czy wszystkie znaki są numeryczne. Tak więc "1.1" nie zwróci true, ponieważ "." nie jest numeryczne, ale "11" będzie. Zauważ, że działa tylko dla ciągów znaków, więc liczby bez otaczających cudzysłowów również nie będą działać.