PHP5.3.5を使用します。これが他のバージョンでどのように機能するかわからない。
数字を保持する文字列を使用することについて混乱しています。たとえば、'0x4B0'または'1.2e3'。PHPがそのような文字列を処理する方法は、私には一貫していないようです。私だけですか?それともバグですか?または文書化されていない機能?それとも、ドキュメントに魔法の文章が欠けているだけですか?
<?php
echo $str = '0x4B0', PHP_EOL;
echo "is_numeric() -> ", var_dump(is_numeric($str)); // bool(true)
echo "*1 -> ", var_dump($str * 1); // int(1200)
echo "(int) -> ", var_dump((int)$str); // int(0)
echo "(float) -> ", var_dump((float)$str); // float(0)
echo PHP_EOL;
echo $str = '1.2e3', PHP_EOL;
echo "is_numeric() -> ", var_dump(is_numeric($str)); // bool(true)
echo "*1 -> ", var_dump($str * 1); // float(1200)
echo "(int) -> ", var_dump((int)$str); // int(1)
echo "(float) -> ", var_dump((float)$str); // float(1200)
echo PHP_EOL;
どちらの場合も、をis_numeric()返しますtrue。また、どちらの場合も、$str * 1文字列を解析して有効な数値を返します(ある場合は整数、別の場合は浮動小数点数)。
でキャストする(int)$strと(float)$str、予期しない結果が得られます。
(int)$strいずれの場合も、数字の前にオプションの「+」または「-」を付けて、数字のみを解析できます。(float)$strより高度で^[+-]?\d*(\.\d*)?(e[+-]?\d*)?、たとえば、オプションの「+」または「-」、オプションの数字、オプションの数字を含むオプションの小数点、オプションの「+」を含む「e」で構成されるオプションの指数などを解析できます。 「-」の後にオプションの数字が続きます。ただし、16進データでは失敗します。
関連ドキュメント:
- is_numeric() -「16進表記(0xFF)も許可されますが、符号、小数、および指数部分がない場合のみ」と記述されています。文字列が数値データを保持しているかどうかをテストすることを目的とした関数がtrueを返す場合、PHPはそのような文字列を数値に変換できると期待しています。これはで機能するようです
$str * 1が、キャストでは機能しません。なんで? - 整数への変換-「演算子、関数、または制御構造が整数引数を必要とする場合、値は自動的に変換されるため、ほとんどの場合、キャストは必要ありません」と述べています。
$s * 10そのようなステートメントの後、私はと(int)$s * 10式の両方が同じように機能し、同じ結果を返すことを期待しています。ただし、例に示すように、これらの式の評価は異なります。 - 文字列の数値への変換-「有効な数値データはオプションの符号であり、その後に1つ以上の数字(オプションで小数点を含む)が続き、その後にオプションの指数が続く」と記載されています。「指数」は「e」または「E」の後に数字が続きます。たとえば、
1.2e3有効な数値データです。記号(「+」または「-」)は記載されていません。16進値については言及されていません。これは、で使用される「数値データ」の定義と競合しますis_numeric()。次に、「この変換の詳細については、strtod(3)のUnixマニュアルページを参照してください」という提案があり、man strtod追加の数値(HEX表記を含む)について説明しています。それで、これを読んだ後、16進データは有効または無効な数値データであると思われますか?
それで...
is_numeric()文字列が数値として使用される場合、PHPが文字列を処理する方法との間に何らかの関係がありますか(または、むしろあるべきです) ?- なぜ
(int)$s、(float)$sそして$s * 1異なる働きをするのか、すなわち。$sis0x4B0または1.2e3?の場合、まったく異なる結果が得られます。 0x4B0文字列がとしてまたはとして記述されている場合、文字列を数値に変換してその値を保持する方法はあります1.2e3か?floatval()HEXでまったく機能しない、HEXで機能するように設定するintval()必要があり、型キャストする必要があり、機能する場合もあれば機能しない場合もあるため、これらは有効なオプションではありません。変換というよりはデータ操作のように見えるので、私も考慮していません。私はネイティブソリューションを探しているので、この場合、自己作成関数も考慮されません。$base16(int)$str(float)$str$n *= 1;