当字符串为十六进制且前缀为“0x”时,将字符串转换为整数时不一致

2023-11-30

使用 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(使用前将#替换为@)

当字符串为十六进制且前缀为“0x”时,将字符串转换为整数时不一致 的相关文章

  • 如何正确转义 CSV 中的双引号?

    我的 CSV 中有这样一行 Samsung U600 24 10000003409 1 10000003427 旁边引用24用于表示英寸 而该引号旁边的引号则关闭该字段 我正在读这行fgetcsv但解析器犯了一个错误 并将该值读取为 Sam
  • 通过 XMLHttpRequest 将数据从 JavaScript 发送到 PHP

    再会 我正在尝试将一段简单的数据从一个 php 文件 manage php 发送到另一个 view php 我无法通过表单发送数据 我想通过 JS 脚本发送数据 这是我的尝试 var read function id xmlhttp new
  • 用于分页的php示例脚本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以建议一个好的分页 php 脚本 其中人们想要分页显示数据库中的大量项目 以下链接可以帮助您
  • 计算两个数字之间的差异

    我想计算两个给定数字之间的差异 例如 1 5 或 24 35 我必须将数组中的数字分开并写出它们之间的差异 如下所示 1 2 3 4 5 或 24 25 26 27 28 29 30 31 32 33 34 35 是否有任何 php 函数可
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • 如何在 标签中用 %20 替换空格

    我想替换 html 文本的图像标签中的所有空格 Example img src to img src photo 201 jpg 我没有找到 preg replace 的解决方案 但它可能是一个简单的正则表达式行 谢谢 Edit 抱歉各位
  • 这些加密算法有什么区别?

    两者有什么区别MCRYPT RIJNDAEL 128 MCRYPT RIJNDAEL 256 MCRYPT BLOWFISH等等 哪一种最适合网络数据传输 Rijandel 是 AES 的另一个名称 AES 是当前的 一个好的标准 算法 数
  • xdebug_start_trace 行为异常

    我正在尝试进一步减少脚本内存使用量 我试图让我的脚本使用 xdebug 生成输出来分析内存使用情况 这是一个基于 CLI 的脚本 有 shebang usr local bin php q 我向它传递一个参数并检查它 argc gt 1 i
  • 如何在 PHP 中正确分割路径

    执行以下操作的最佳方法是什么 我通过 AJAX 请求获取路径 e g dir1 dir2 dir3 dir4 我需要在我的网页上这样展示它 dir1 gt gt dir2 gt gt dir3 gt gt dir4 它们每个都是 html
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • 使用 php 将 HLS Segment (ts) 视频转换并加入到 mp4

    你好我正在使用这个工具 https github com Ejz HLSDownloader https github com Ejz HLSDownloader将 HLS 视频片段从 m3u8 播放列表下载到 ts 文件中 不 我不知道如
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • 如何覆盖 phpunit 中导出的变量?

    我知道我可以设置环境变量 https phpunit de manual current en appendixes configuration html在我的 phpunit xml 里面
  • ZF2 工厂获取参数

    我有一个动态类别导航 在导航工厂中 我想从路线获取参数 我怎样才能做到这一点 在我看来 在我的 module php 中 public function getServiceConfig return array factories gt
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que
  • PHP - 查找和比较日期

    你好 我有 foreach 我可以在其中获取数据库中的事件数据 我使用数据库中的日期名称 例如 event date 我需要在一个 div 中比较具有相同日期和输出的操作 例如我有这个事件 活动一 9 月 13 日 活动二 9 月 1 日
  • PHP 除法浮点值问题

    当我尝试获取余数时 它给出了无效值 我试图获得两位小数的余数 我得到 3 4694469519536E 18 我的价值观是 x 0 1 y 0 005 我尝试了以下方法 echo ed fmod 0 1 0 005 OutPut 3 469
  • 处理查询字符串参数时 Codeigniter 缓存问题

    问候 我正在编写一个 CI Web 应用程序 它实现标准文件缓存功能 如下所示 this gt output gt cache n 我使用了段和查询字符串参数的组合 因此似乎遇到了问题 我在用例和输出类代码中看到的是 缓存仅基于段 像这样

随机推荐