2012-09-29 15 views
13

Powiel możliwe:
Check if a variable is a natural numberOdpowiednik PHP dla funkcji parseInt?

Właśnie natknąłem gdzie trzeba zdezynfekować wejście i usunąć wszystkie znaki nie-cyfrowe z PHP. Myślałem o samodzielnym stworzeniu funkcji, ale najpierw chciałem sprawdzić dostępne funkcje, więc nie będę musiał poświęcać więcej czasu na wymyślanie koła.

+0

sprawdź [php.net/Type Casting] (http://php.net/manual/en/language.types.type-juggling.php) – air4x

+0

Dlaczego po prostu nie używać intval? – endy

Odpowiedz

23

Można użyć wyrażenia regularnego jak poniżej

$int = (int) preg_replace('/\D/', '', $strNonNumeric); 

LUB

$int = (int) preg_replace('/[^0-9]/', '', $strNonNumeric); 
+0

ah, dokładnie to, co chciałem. Wielkie dzięki. – think123

+2

@ think123 - warto zauważyć, że (a) to nie tworzy int; wciąż jest ciągiem znaków, aczkolwiek zawiera tylko cyfry, a (b) regex jest przesadą dla tego scenariusza. – Spudley

+1

To prawda, ale to jedna z tych, które naprawdę działają. Będę edytować wszystko tak samo. – think123

2

Można użyć:

$string = "90"; //string 
$myInt = (int) $string; //parse to int 
+0

Przepraszamy, ale to nie jest dokładnie to, czego chcę. '(int)' nie usunie wszystkich znaków nie będących cyframi, po prostu zwróci '0', jeśli w ciągu znaków znajdują się znaki inne niż cyfry. – think123

+2

@ think123: Wpisz rzutowanie '(int)' zrobi to samo, 'parseInt()' w javascript. To jest to, o co prosiłeś, prawda? –

0

Można również użyć sscanf (podobnie jak to zrobić w C)

<?php 

    $str = "10"; 

    sscanf($str, "%d", $intVal); 
    $intVal *= 10; 

    echo $intVal; 
?> 

wyjściowa:

3

polecam korzystania FILTER_VALIDATE_INT filtr.

about Filters on php.net

+0

-1 Nie umieszczaj linku w3schools. Zamiast tego wstaw "php.net", a oddam ci głos. – think123

+1

+2 oddał głos z powrotem, zgodnie z gwarancją. – think123

+3

No i tylko z jakiegoś powodu: http://www.w3fools.com – think123

19

Nie jest bezpośrednim odpowiednikiem pareseInt() w PHP, ponieważ PHP nie posiada typ NaN danych. parseInt() spowoduje wygenerowanie NaN, jeśli nie można przeanalizować wartości.

Poza tym parseInt() ma parametr radix, który nie daje żadna z opcji PHP.

Ale powiedział, że jeśli wszystko, co chcesz zrobić, to włączyć ciąg do liczby całkowitej, to istnieje kilka opcji:

$int = (int)$string; 

$int = intval($string); 

$int = settype($string,'integer'); 

Te trzy będą wszystkie działają w taki sam sposób. Mogą występować pewne skrajne przypadki, w których intval() różni się od pozostałych dwóch, ale ogólnie rzecz biorąc, zamieniają one łańcuch w int. W przypadku braku NaN, wszystkie one wyprowadzają 0 (zero), jeśli łańcuch nie jest liczbowy i nie można go przeanalizować. Ale to powinno wystarczyć dla większości celów sanitarnych DB.

Jeśli naprawdę chcesz, aby błąd NaN był wyświetlany, najbliżej otrzymasz: null. Formularz ten można uzyskać stosując filter_var():

$value = filter_var(FALSE, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 

Jeśli chcesz po prostu sprawdzić, czy ciąg jest numeryczna, funkcja is_numeric() może to zrobić:

$bool = is_numeric($string); 

jednak zwraca true dla miejsc po przecinku, a także dla notacja naukowa, więc może nie być idealny w większości sytuacji.Lepszym rozwiązaniem jest ctype_digit() która zwraca true jeśli ciąg składa się wyłącznie z cyfr:

$bool = ctype_digit($string); 

Jeśli non e od tego garniturach, zawsze istnieje opcja regex, używając preg_match() lub preg_replace(), ale są to na pewno przesadą tego rodzaju scenariusz.

+0

Używanie (int) i intval() są bardzo odporne na błędy, ale należy pamiętać, że jeśli ciąg reprezentuje liczbę zmiennoprzecinkową (np. Ma miejsca dziesiętne) , wtedy te funkcje po prostu usuwają wszystko, co nadejdzie po punkcie. Tak więc "3.999" staje się 3. – Wytze

+0

@Wytze: prawda, ale pytanie dotyczyło usunięcia znaków nie będących cyframi, więc założenie byłoby takie, że nie jest to liczba dziesiętna. Istnieją inne opcje, jeśli musisz obsługiwać ułamki dziesiętne. – Spudley