【问题标题】:php converting string to integer unexpected behaviourphp将字符串转换为整数意外行为
【发布时间】:2017-11-09 10:03:28
【问题描述】:
var_dump((int) 010);  //Output 8

var_dump((int) "010"); //output 10

无法理解PHP从字符串到整数的数据类型转换方法。

第一个是八进制,所以输出是正确的。但是将“010”转换为整数时呢?它也应该是输出 8。

下面所有的答案都是 var_dump((int) 010); ,但我想回答 var_dump((int) "010");

【问题讨论】:

标签: php


【解决方案1】:

使用(int) 转换为整数将始终转换为默认基数,即 10。

以这种方式将 字符串 转换为数字并没有考虑在 PHP 中格式化整数值的多种方式(前导零表示基数 8,前导“0x”表示基数 16,前导“ 0b" 用于基数 2)。它只会查看字符串中的第一个字符并将它们转换为以 10 为底的整数。前导零将被去除,因为它们在数值中没有任何意义,因此您最终将得到十进制值 10 for (int)"010"

使用(int)010在基数之间转换整数值考虑格式化整数的各种方式。 010 中的前导零表示该数字采用八进制表示法,使用 (int)010 会将其转换为以 10 为底的十进制值 8

这类似于您如何使用0x10 以十六进制(以 16 为基数)表示法编写。使用 (int)0x10 会将其转换为以 10 为底的十进制值 16,而使用 (int)"0x10" 将最终得到十进制值 0:因为“x”不是数值,所以后面的任何内容都将被忽略.

如果要将字符串"010" 解释为八进制值,则需要指示 PHP 这样做。 intval("010", 8) 将解释以 8 为基数的数字,而不是默认的以 10 为基数的数字,您最终将得到十进制值 8。您还可以使用octdec("010") 将八进制字符串转换为十进制值8。另一种选择是使用base_convert("010", 8, 10) 将数字“010”从基数8 显式转换为基数10,但是此函数将返回字符串 "8" 而不是整数8

【讨论】:

    【解决方案2】:

    将字符串转换为整数遵循与intval 函数相同的逻辑:

    返回 var 的整数值,使用指定的基数进行转换(默认为基数 10)。

    intval 允许将不同的基数指定为第二个参数,而直接转换操作则不允许,因此使用(int) 将始终将字符串视为基数为 10。

    php > var_export((int) "010");
    10
    php > var_export(intval("010"));
    10
    php > var_export(intval("010", 8));
    8
    

    【讨论】:

    • 解释得很好
    【解决方案3】:

    0 开头的整数采用八进制表示法。

    对于以0x 开头的十六进制整数(例如0x2A)和以0b 开头的二进制整数(例如0b101010)也是如此。

    相关文档:http://php.net/manual/language.types.integer.php

    【讨论】:

      【解决方案4】:

      010 被视为八进制数:

       010 = 0 x 8^0 + 1 x 8^1
      

      更多信息可以查看intval documentation

      【讨论】:

        【解决方案5】:

        PHP 以八进制处理以零开头的数字,所以这个结果是绝对正确的。
        您应该查找PHP Integers 以获取有关此主题的更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-05
          • 2023-04-10
          • 1970-01-01
          相关资源
          最近更新 更多