2016-07-24 23 views
2

入力を確認しようとしています。入力は整数、浮動小数点数または文字列です。このプログラムは負の入力にエラーを与えますが、なぜこのようなことが起こるのか分かりません。 "ctype_digit()"で入力をチェックすると、is_intセクションがエスケープされます。 PHPマニュアルから"is_int"が正しく動作していませんか?

<?php 
$var=fgets(STDIN); 
if(is_numeric($var)) 
{ 
    //print "$var"; 
    if(ctype_digit($var) || is_int($var)){ 
     print "$var"; 
     print "This type of input is Integer"; 
    } 
    else{ 
     //print "$var"; 
     print "This type of input is Float"; 
    } 
} 
else{ 
    print "This type of input is String"; 
} 
?> 
+2

私はそれをテストしただけで、負の数で動作しました。どのPHPバージョンを使用していますか? –

+2

'var_dump($ var);'出力は何ですか? –

+1

あなたのコメント '' ctype_digit() 'で入力をチェックすると、is_intセクションがエスケープされます。あなたは '||'が何をするのか理解していますよね? –

答えて

4

ctype_digit

注: この関数は、整数を渡す例えば期待される結果を返さないかもしれないので、文字列は、有用であると期待します。しかし、HTMLフォームは整数ではなく数値文字列になります。マニュアルの型セクションも参照してください。

is_int

注: 変数が数字または(常に文字列である、そのようなフォーム入力など、)数値文字列であるかどうかをテストするには、)(IS_NUMERIC使用する必要があります。

整数評価のために、このにfilter_var($のVAR、FILTER_VALIDATE_INT)のようなフィルタを使用してください。

<?php 

$var = -10.12; 

if(is_numeric($var)) 
{ 
    //print "$var"; 
    if(filter_var($var, FILTER_VALIDATE_INT)){ 
    var_dump(filter_var($var, FILTER_VALIDATE_INT)); 
     print "$var"; 
     print "This type of input is Integer"; 
    } 
    else{ 
     //print "$var"; 
     print "This type of input is Float"; 
    } 
} 
else{ 
    print "This type of input is String"; 
} 
?> 
+0

このコードは非常にうまくいきましたが、 "var_dump()"からmsgを印刷したくない場合はどうすればいいですか? –

+0

var_dump()を表示する行をコメントとして//追加するだけです。 '// var_dump(filter_var($ var、FILTER_VALIDATE_INT));'私はあなたがフィルタからのブール値を見たいので、行を追加しました。 – kip

0

マイナスが( " - ")ためのctypeが負の数で失敗POSIX桁の文字クラスの一部と見なされていない([0-9。])。私のPHP(5.3)も負の文字列 '-1'で失敗します。

他の人が言っていることにもかかわらず、filter_vars()は適切な解決策ではありません。それは実行可能かもしれませんが、OPはプリミティブ値をテストしており、ユーザの入力をサニタイズしようとしていません。彼はまたctype()がうまくいかない理由と、そうでない変数テストについて質問しています。 filter_vars()は他の一般的なPHPバージョン(< 5.2)では動作しません。さらに、彼のテストは関数呼び出しを追加することなく実行できます。

の代わり: (ctype_digit($ VAR)|| is_int($のVAR))であれば

はそれをキャスト。

foreach (array (-1, 0, 1,1.1,'1.1','1','abc','0','-1') as $test) 
{ 
    if (is_numeric($test)) 
    { 
     if ((int) $test == $test) // <-- HERE 
     { echo "int: $test\n"; } 
     else 
     { echo "float: $test\n"; } 
    } 
    else 
    { echo "string: $test\n"; } 
} 

/* 
returns: 
int: -1 
int: 0 
int: 1 
float: 1.1 
float: 1.1 
int: 1 
string: abc 
int: 0 
int: -1 
*/ 

注:(int)が、(int)を「1」に任意の非整数文字列を向けるだろう、と==文字列に対しても、「ABC」のためになるよう、1に文字列をキャストします'abc' == 'abc'は1 == 1を生成します。これは、数値文字列テストが最初に行われなければならないか、あるいは他の純粋な文字列テストが最初に行われなければならないことを意味します。

注2:スペースを含む文字列では失敗します。例えば「1」である。おそらく追加します$var=is_string($var) ? trim($var) : $var;

+0

なぜ人々は正しい答えを下降させていますか? – Beracah

関連する問題