8

is_numeric、intval、ctype__digit.. 信頼できますか?

それとも正規表現を使用する必要がありますか?

関数 isNum($str) {
return (preg_match("/^[0-9]+$/", $str));
}

皆さんはどう思いますか?私は愚かですか?

4

7 に答える 7

18

ctype_digitとの重要な違いの 1 つis_numerictは、負の値と浮動小数点数です。

is_numeric(-10)が返さtrueれますが、「ctype_digit(-10)」はfalse

また、ctype_digit(12.50)返されfalseます is_numeric(12.50)が、true

したがって、ドメインロジックのコンテキストに応じて、どちらも便利です。

于 2014-10-02T08:46:40.080 に答える
13

is_numeric、intval、および ctype_digit はすべて非常に異なることを行います。

is_numericは、変数の内容が数値かどうかを示します (つまり、浮動小数点または整数値の場合は true)。

intvalは、数値の文字列を整数値に変換しようとします

ctype_digitは、文字列に数字のみが含まれているかどうかを示します ( isNum 関数と同じチェックを実行します)。

最善の方法は、おそらく is_numeric が true かどうかを確認してから、settype($myvalue, 'integer') または intval($myvalue); の行に沿って何かを使用することです。

于 2009-01-20T18:28:27.867 に答える
5

次の 2 種類の関数に名前を付けました。

Validatorは、指定された値が指定された特性を持っているかどうかをチェックし、trueまたはfalse返します。
is_numericctype_*関数とあなたのisNum関数は、値が有効かどうかを伝えるだけなので、関数を検証しています。

Filterは、新しい値が指定された特性を持ち、有効になるように、指定された値を変更します。関数は常にバリデータを渡す有効な値を返すため
intvalfilter_*関数はフィルタリング関数です。

于 2009-01-20T20:53:04.160 に答える
2

新しいフィルター機能も使用できます。

if (!$var = filter_var($var, FILTER_VALIDATE_INT)) {
  die('Not an int!');
}

echo "Var has the value $var.\n";

cli、Web クライアントなどからの入力をフィルタリングする場合に最適です。フィルタのリストはこちら.

于 2009-01-20T19:36:17.997 に答える
0

私は PHP の専門家ではありませんが、これらの機能を具体的に理解するために、データ駆動型単体テストを作成することを検討したことがありますか。それらの信頼性が不確かで、ドキュメントが不明確な場合は、何千もの順列と期待される出力をテストできる単体テストに勝るものはありません。

いくつかの特別なエッジケースのみをテストしたいだけだと私が想像する限り、実際にはそこまで行く必要さえありません。ここでは、あなたのプログラミング スキルとコンパイラがあなたの親友です。あなたが書いたプログラムは、あなたの疑いを肯定または否定します。

また、ボーナスを投入するために、各メソッドにかかる時間を監視し、どちらがよりパフォーマンスが高いかを確認できます.

ちょっとした考え。

于 2009-01-20T18:21:44.887 に答える
0

intval だけを使用しない理由がわかりません。結局のところ、あなたの正規表現は負の数を考慮していませんが、 intval はそうします(おそらくそれがあなたの目的ですか?)。

または、単に int にキャストするだけでも、intval で発生する難解な浮動小数点の「落とし穴」を回避できます。

于 2009-01-20T18:24:28.640 に答える