使用 PHP 5.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”和可选的“+”或“-”后跟可选数字。虽然在十六进制数据上失败。
相关文档:
- is_numeric() - 声明“也允许使用十六进制表示法 (0xFF),但只能没有符号、十进制和指数部分”。如果用于测试字符串是否包含数字数据的函数返回 true,我希望 PHP 能够将此类字符串转换为数字。这似乎适用于
$str * 1
,但不适用于强制转换。为什么? - 转换为整数- 声明“在大多数情况下不需要强制转换,因为如果运算符、函数或控制结构需要整数参数,则会自动转换值”。在这样的声明之后,我希望
$s * 10
和(int)$s * 10
表达式都以相同的方式工作并返回相同的结果。但是,如示例所示,这些表达式的评估方式不同。 - 字符串转换为数字- 声明“有效的数字数据是一个可选符号,后跟一个或多个数字(可选包含小数点),后跟一个可选指数”。“指数”是“e”或“E”,后跟数字,例如,
1.2e3
是有效的数字数据。未提及符号(“+”或“-”)。它没有提到十六进制值。这与中使用的“数字数据”的定义相冲突is_numeric()
。然后,建议“有关此转换的更多信息,请参阅 strtod(3) 的 Unix 手册页”,并man strtod
描述了其他数值(包括 HEX 表示法)。那么,读完这篇文章后,十六进制数据应该是有效还是无效的数字数据?
所以...
is_numeric()
当字符串用作数字时,PHP 处理字符串的方式和方式之间是否存在(或者应该存在)任何关系?- 为什么这样做
(int)$s
,(float)$s
并且$s * 1
工作方式不同,即。给出完全不同的结果,什么时候$s
是0x4B0
或1.2e3
? - 有没有办法将字符串转换为数字并保留其值,如果它被写为
0x4B0
或1.2e3
?floatval()
根本不适用于 HEX,intval()
需要$base
设置为16
使用 HEX,类型转换(int)$str
有时(float)$str
有效,有时无效,因此这些不是有效选项。我也没有考虑$n *= 1;
,因为它看起来更像是数据操作而不是转换。在这种情况下也不考虑自写函数,因为我正在寻找本机解决方案。