2012-01-02 57 views
4

我正在嘗試做一個基本操作:檢查字符串是否是數字。

這不起作用:

$qty = $_REQUEST[qty]; 
if (is_int($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

這一個作用:

$qty = 1; 
if (is_int($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

$_REQUEST[qty]張貼與AJAX請求($.post). $_REQUEST[qty]不是空的,並且只包含數字(1)。

is_numeric()不會工作,因爲它將1e4視爲一個數字。

+1

你的意思是'$ qty = $ _REQUEST ['qty']'(帶引號)...? – evotopid 2012-01-02 13:47:11

+0

沒關係。始終在任何腳本中使用或不使用引號。 – 2012-01-02 13:48:50

+0

@Radio是的,它的工作原理,但也提出了一個'NOTICE'級錯誤(_PHP注意:使用未定義的常量foo - 假設'foo'_)。省略引號PHP假設你的意思與引號相同。有一次,當你實際上有一個同名的常量,你會在捕捉它之前拉長頭髮。總是使用引號。 – 2012-01-02 13:53:52

回答

6

如果變量是整型,is_int將只返回true。 如果你想測試,如果變量包含了代表一個數字, 使用的字符串:

is_numeric("1"); 

來源:http://php.net/manual/en/function.is-int.php

編輯:

使用ctype_digit()來檢查字符串中的每個字符,如果它是要排除的數字「1e4」

+0

就像我說的is_numeric()不是去工作,看看原因。 – 2012-01-02 13:49:41

+1

OP特別提到的是'is_numeric()來'是不是他一個解決方案,因爲它也接受科學記數法和浮點數... – codeling 2012-01-02 13:50:35

+0

此外,有可能是一個辦法通過正則表達式來做到這一點。 我吸的正則表達式,但是這可能有了答案:http://davidwalsh.name/php-validatie-numeric-digits – Rodik 2012-01-02 13:53:10

2

嘗試「is_numeric()」而不是「is_int」...

我認爲你從你的請求... 和is_int真的檢查一個給定的對象是一個整數...但它不是 - >它是一個字符串。

is_numeric只是檢查一個對象是否可以轉換爲整數。如果是這樣,則返回true,否則爲false ...

$qty = $_REQUEST[qty]; 
if (is_numeric($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

PS:使用$ _ POST []或$ _REQUEST [] $ _GET [] insetead;)

+0

is_numeric()將值「1e4」視爲TRUE。我只需要檢查號碼。 http://www.php.net/manual/en/function.is-numeric.php – 2012-01-02 13:51:49

4

如果您要檢查的只有數字的存在,您可以使用ctype_digit

2

你提到你不能使用is_numeric,因爲它將1e4視爲一個數字。那麼,1e4是一個數字。具體1 * 10^4

您可以使用is_int(intval($_REQUEST['qty'])),但因爲intval總是返回一個int(失敗或空輸入時爲0),因此存在誤報的風險。但是,與is_numericfilter_var相結合,您應該處於相當穩固的狀態。

+0

你得開玩笑嗎?沒有PHP運算符來查明字符串是否只是一個數字? =)) – 2012-01-02 13:55:48

+0

@Radio如果你的意思是一個僅由digits組成的字符串,答案就是@Srisa在他的回答中提到的'ctype_digit',或者是一個正則表達式。 – 2012-01-02 13:58:05

2

做一個not-identical comparison­Docs同時使用字符串和整鑄:

if ($qty !== (string)(int)$qty) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

這基本上是直譯:由於所有傳入的變量是字符串,你不能檢查他們是一個整數,除非你施放它們的整數,然後回到字符串。裹成一個功能,如果是硬的內嵌代碼,把握它做什麼:

/** 
* string is integer value? 
* 
* @return bool 
*/ 
function is_int_string($string) 
{ 
    return $string === (string)(int)$string; 
} 

$qty = $_REQUEST[qty]; 
if (is_int_string($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

HTTP是一個文本協議,所以只有在開始的字符串。

+0

(int)$ qty會將任何字母字符視爲INT。不起作用。 – 2012-01-02 14:05:46

+0

@Radion:現在我明白你的意思了,我稍微編輯了答案來處理這個問題,這是相同的原理,並進行了比較。 – hakre 2012-01-02 14:11:20

+0

聽起來像解決方案,而不是我的一樣簡單:如果{} – 2012-01-02 14:33:10

2

實際上,所有$ _REQUEST(以及$ _GET,$ _POST等)值始終爲字符串

$qty$_REQUEST[qty]它是一個字符串,而不是一個整數。當$qty1時,它已經是一個整數。

使用intval函數將其轉換爲整數。但正如你說,你只是想看看它是否是一個整數或沒有,所以用floatval將它轉換,然後檢查是否相等:

if (intval($qty) == floatval($qty)) { 
    echo "Ok!"; 
} else { 
    echo "error"; 
} 
0

我決定去的preg_match()。

if (!preg_match("/^[0-9]+$/", $_REQUEST[qty])) {}