2

私はphpに非常に慣れていません。文字列を整数値に変換したいです。

次のコードを使用して変換しました

$val='(100*2)';
echo (int)($val); //This will showing output as 0

しかしecho (int)((100*2)); /This will showing output as 200

これを解決するために誰か助けてください。よろしくお願いします

4

6 に答える 6

3

(int)($val)$valの値は数値文字列 (つまり、数値に直接キャストできるもの) ではないため、 は 0 と評価されます。

この種の機能が本当に必要な場合は、次を試してくださいeval()

$val='(100*2)';
echo (int)($val); //This will showing output as 0
eval('$newval='.$val.';');
echo $newval;

ただし、注意してください:eval()危険な場合があります!

http://php.net/manual/en/function.eval.phpから:

注意

eval() 言語構造は、任意の PHP コードを実行できるため、非常に危険です。したがって、その使用はお勧めできません。この構文を使用する以外に選択肢がないことを慎重に確認した場合は、ユーザーが提供したデータを事前に適切に検証せずに渡さないように特に注意してください。

EDIT : eval パラメータに追加.';'して、正当な php 命令にします。

于 2013-10-01T12:10:11.500 に答える
1

php eval 関数を使用してそれを行うことができます。そのためには、まず特殊文字と等式文字をチェックする必要があります。

$val='(100*2)';
echo matheval($val);

function matheval($equation)
{
   $equation = preg_replace("/[^0-9+\-.*\/()%]/","",$equation);
   // fix percentage calcul when percentage value < 10
   $equation = preg_replace("/([+-])([0-9]{1})(%)/","*(1\$1.0\$2)",$equation);
   // calc percentage
   $equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation);
   // you could use str_replace on this next line
   // if you really, really want to fine-tune this equation
   $equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation);
   if ( $equation == "" )
   {
        $return = 0;
   }
   else
   {
        eval("\$return=" . $equation . ";" );
   }
   return $return;
}
于 2013-12-16T10:18:20.733 に答える
1

最も一般的な提案は、次のように文字列を PHP コードとして評価することです。

$val = '(100*2)';
eval('$val = '.$val.';');

-しかし、それは安全でevalはありません。可能な限り避けるべきです。

あるいは、 PHP 用のbcParserがあり、このような問題を解決できます。よりも安全ですeval

最後に、本当にそのようなことをする必要があるとは思えません - 間違った方法で問題を解決しているようです ( XY 問題の説明を参照してください) 。

于 2013-10-01T12:13:02.237 に答える
0

あなたは目標を与えていません。

あなたのコードがそのように機能する理由を説明できます。

'(100*2)' は、数値以外の文字が含まれているため、int に変換できない文字列です。変換できない文字列はすべて 0 になります。

数値を使用し、文字列を使用しないため、echo (int)(100*2) が機能します。変換する必要もありません。キャストがなくても機能します。エコー (100*2) するだけです。

PHP は緩やかな型付けを使用することを忘れないでください。型を変換する必要はほとんどありません。このシナリオは非常に設定されています。

于 2013-10-01T12:10:49.410 に答える