2012-11-21 8 views
6

mogę używać intval, ale zgodnie z dokumentacją:Jak poprawnie przeanalizować liczbę całkowitą w PHP?

Struny najprawdopodobniej zwróci 0, chociaż to zależy od LEFTMOST znaków łańcucha. Obowiązują wspólne zasady odlewania całkowitoliczbowego .

... a wartość do analizowania może być 0, to nie będę w stanie odróżnić od zera i string.

$value1 = '0'; 
$value2 = '15'; 
$value3 = 'foo'; // Should throw an exeption 

Prawdziwe pytanie brzmi: w jaki sposób można analizować ciąg i odróżnić string że oddane do 0 i samego zera?

+0

Jak konserwatywny musisz być? intval działa dobrze, ale jeśli spodziewasz się, że ciąg zawiera wartości nieliczbowe i musisz ZACHOWAĆ wartości liczbowe, będziesz chciał uruchomić go najpierw przez preg_replace. –

+0

@ cale_b ciąg powinien być cały numeryczny do obsadzenia. – gremo

Odpowiedz

8

W poniższym kodu $int_value zostanie ustawiony null jeśli $value nie rzeczywisty ciąg liczbowy (podstawa 10 i dodatnich), w przeciwnym razie będzie ustawiona na wartość liczby całkowitej $value:

$int_value = ctype_digit($value) ? intval($value) : null; 
if ($int_value === null) 
{ 
    // $value wasn't all numeric 
} 
+0

Idę spróbować, dzięki. – gremo

+1

Nie będę działał na ujemne liczby całkowite ("-" nie jest cyfrą) – data

0

Nie testowałem porównując z ctype_digit(), ale uważam, że poniższe rozwiązanie jest miłe. Oczywiście zależy to od dokładnego zachowania, jakiego się spodziewasz.

function parseIntOrException($val) { 
    $int = (int)$val; 
    if ((string)$int === (string)$val) { 
    throw \Exception('Nope.'); 
    } 
    return $int; 
} 

http://3v4l.org/Tf8nh

1  1 
'2'  2 
'3.0' false 
4.0  4 
5  5