使用 PHP 5.3.5。不确定这在其他版本上如何工作。
我对使用包含数字的字符串感到困惑,例如,'0x4B0'
or '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
and (float)$str
给出意想不到的结果。
-
(int)$str
在任何情况下都只能解析数字,前面有可选的“+”或“-”。
-
(float)$str
更高级,可以解析类似的东西^[+-]?\d*(\.\d*)?(e[+-]?\d*)?
,即可选的“+”或“-”,后跟可选的数字,后跟可选的小数点和可选的数字,后跟由“e”和可选的“+”或“-”后跟可选的数字组成的可选指数。但在十六进制数据上失败。
相关文档:
-
is_numeric()- 指出“也允许使用十六进制表示法 (0xFF),但只能没有符号、小数和指数部分“。如果函数(旨在测试字符串是否包含数字数据)返回 true,我希望 PHP 能够将此类字符串转换为数字。这似乎适用于
$str * 1
,但不适用于铸造。为什么?
-
转换为整数- 指出“在大多数情况下,不需要强制转换,因为如果运算符、函数或控制结构需要整数参数,则会自动转换值”。在这样的声明之后,我希望两者
$s * 10
and (int)$s * 10
表达式以相同的方式工作并返回相同的结果。不过,如示例所示,这些表达式的计算方式不同。
-
字符串转换为数字- 指出“有效的数字数据是一个可选的符号,后跟一个或多个数字(可选地包含小数点),后跟一个可选的指数“。“指数”是“e”或“E”,后跟数字,例如,
1.2e3
是有效的数值数据。没有提及符号(“+”或“-”)。它没有提到十六进制值。这与中使用的“数字数据”的定义相冲突is_numeric()
。那么,有建议“有关此转换的更多信息,请参阅 strtod(3) 的 Unix 手册页", and man strtod
描述附加数值(包括十六进制表示法)。那么,读完本文后,十六进制数据应该是有效还是无效的数值数据?
So...
- 之间是否存在(或者更确切地说,应该存在)任何关系
is_numeric()
当字符串用作数字时,PHP 如何处理它们?
- Why do
(int)$s
, (float)$s
and $s * 1
工作方式不同,即。给出完全不同的结果,当$s
is 0x4B0
or 1.2e3
?
- 如果将字符串写为数字,有什么方法可以将其转换为数字并保留其值
0x4B0
or as 1.2e3
? floatval()
根本不适用于十六进制,intval()
needs $base
被设置为16
使用 HEX,进行类型转换(int)$str
and (float)$str
有时有效,有时无效,因此这些不是有效的选项。我也不考虑$n *= 1;
,因为它看起来更像是数据操作而不是转换。在这种情况下也不考虑自写函数,因为我正在寻找本机解决方案.
直接演员表(int)$str
and (float)$str
工作原理根本没有什么不同:它们都从字符串中读取尽可能多的字符,因为它们可以解释为相应类型的数字。
对于“0x4B0”,int 转换读取“0”(正常),然后读取“x”并停止,因为它无法将“x”转换为整数。对于浮点转换也是如此。
对于“1.2e3”,int 转换读取“1”(OK),然后读取“.”。并停止。浮点转换将整个字符串识别为有效的浮点表示法。
类似表达式的自动类型识别$str * 1
只是比显式强制转换更灵活。显式转换要求整数和浮点数采用以下格式生成的格式%i
and %f
in printf
, 本质上。
也许你可以使用intval and floatval不过,而不是显式转换为 int 以获得更大的灵活性。
Finally, your question "is hexidecimal data supposed to be valid or invalid numeric data?" is awkward. There is no such thing as "hexadecimal data". Hexadecimal is just a number base. What you can do is take a string like "4B0" and use strtoul
etc. to parse it as an integer in any number base between 2 and 36.[Sorry, that was BS. There's no strtoul
in PHP. But intval
has the equivalent functionality, see above.]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)