2012-01-02 2 views
4

私は基本的な操作をしようとしています:文字列が数字かどうかを調べることです。

これは動作しません:

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

この1つはありません:

$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

+0

問題ではありません。任意のスクリプトで常に引用符の有無にかかわらず動作します。 –

+0

@ Radioはい、動作しますが、「NOTICE」レベルのエラーも発生します(_PHP通知:定義されていない定数fooの使用 - 'foo'_と仮定)。引用符を省略PHPは、引用符で同じことを意味すると仮定します。あなたが実際に同じ名前で定義された定数を持っているとき、あなたはそれをキャッチする前に長い間毛を引っ張っているでしょう。必ず引用符を使用してください。 –

答えて

6

is_intは、変数が整数型の場合にのみtrueを返します。 あなたは変数が多数、 利用表す文字列が含まれている場合をテストしようとしている場合:

is_numeric("1"); 

ソース:http://php.net/manual/en/function.is-int.php

EDIT:

使用ctype_digit()をチェックするために文字列内のすべての文字が「1e4」を除外する数字の場合

+0

私が言ったようにis_numeric()はそうではありません仕事に行く理由を見てください。 –

+1

OPは、is_numeric()が科学的な表記法や浮動小数点数を受け入れているので、彼には解決策ではないと具体的に言及しています... – codeling

+0

また、Regexでこれを行う方法があるかもしれません。 私はregexで吸うが、これは答えがあるかもしれない:http://davidwalsh.name/php-validatie-numeric-digits – Rodik

2

「is_int」ではなく「is_numeric()」...

私はあなたのリクエストから文字列を取得していると思います... とis_intは実際には指定されたオブジェクトが整数かどうかをチェックします...しかし、それは文字列です。

is_numericは、オブジェクトが整数に変換可能かどうかをチェックするだけです。もしそうなら、それは...そうでない場合はfalse、trueを返します

$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 –

4

あなたがチェックしたい場合数字だけが存在する場合はctype_digitを使用できます。

2

1e4を番号として扱うので、is_numericは使用できません。まあ、1e4は数字です。具体的には1 * 10^4

is_int(intval($_REQUEST['qty']))を使用できますが、intvalは常に偽陽性のリスクを負うため、int(失敗または空の入力の場合は0)を返します。しかし、is_numericまたはfilter_varと組み合わせるとかなり安定しています。

+0

あなたは私を冗談にする必要がありますか?文字列が数字であるかどうかを調べるPHP演算子はありませんか? =)) –

+0

@ラジオあなたが数字だけからなる文字列_を意味するならば、その答えは@Srisaが答えで述べるように 'ctype_digit'です、または正規表現です。 –

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として扱います。動作しません。 –

+0

@Radion:あなたが何を意味しているのか理解したので、それに対処するために答えを少し編集しました。これは同じ原理です。 – hakre

+0

解決策のように聞こえるが、それほど簡単ではない:if(!preg_match( "/^[0-9] + $ /"、$ _REQUEST [qty])){} –

2

実際には、すべての$ _REQUEST(および$ _GET、$ _POSTなど)の値は常に文字列です。

$qty$_REQUEST[qty]の場合、整数ではなく文字列です。 $qty1の場合、既に整数です。

intval関数を使用して整数に変換します。しかし、あなたはあなただけそれが整数だかどうかを調べるため、それらが等しいかどうかを確認、その後、それを変換するためにfloatvalを使用したい、と言うよう:

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

私は)(するpreg_matchで行くことにしました。

関連する問題