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
異なる働きをするのか、すなわち。$s
is0x4B0
または1.2e3
?の場合、まったく異なる結果が得られます。 0x4B0
文字列がとしてまたはとして記述されている場合、文字列を数値に変換してその値を保持する方法はあります1.2e3
か?floatval()
HEXでまったく機能しない、HEXで機能するように設定するintval()
必要があり、型キャストする必要があり、機能する場合もあれば機能しない場合もあるため、これらは有効なオプションではありません。変換というよりはデータ操作のように見えるので、私も考慮していません。私はネイティブソリューションを探しているので、この場合、自己作成関数も考慮されません。$base
16
(int)$str
(float)$str
$n *= 1;