为什么答案是15?

时间:2013-05-31 06:33:32

标签: php string numbers

对于以下代码段:

$a = '5 USD';
$b = 10;
echo $a + $b;

答案是15.但在变量$a中如果5位于'USD'之间或'USD'之后,则输出为10。为什么会这样?有人可以解释一下吗?

3 个答案:

答案 0 :(得分:13)

来自php.net

  

在数值上下文中计算字符串时,结果值   和类型确定如下。

     

如果字符串不包含任何字符'。','e'或'E'   并且数值适合整数类型限制(由...定义)   PHP_INT_MAX),该字符串将被计算为整数。在所有其他   案例将被评估为浮动。

     

该值由字符串的初始部分给出。如果是字符串   从有效的数字数据开始,这将是使用的值。   否则,该值将为0(零)。有效的数字数据是   可选符号,后跟一个或多个数字(可选地包含一个   小数点),后跟可选的指数。指数是一个   'e'或'E'后跟一个或多个数字。

字面上:

  1. $a + $b表示numeric + numeric
  2. "5 USD" 以有效的数字数据开头,因此PHP会将其转换为5
  3. "USD 5""U5SD" 有效数字数据开头,因此PHP会将其转换为0

  4. <强> UPDv1:

    <?php
    header('Content-Type: text/plain');
    
    function plus($a, $b){
        echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
    }
    
    plus('5 frogs', 3);   // 5 + 3 = 8
    plus('frogs: 5', 3);  // 0 + 3 = 3
    plus('f5rogs', 3);    // 0 (not HEX)  + 3 = 3
    plus('0xF5', 3);      // 245 (HEX)    + 3 = 248
    plus('0011b', 3);     // 11 (not BIN) + 3 = 14
    plus('1E5', '1.2xx'); // 100000 (FLOAT) + 1.2 (FLOAT) = 100001.2
    plus('true', 2);      // 0 (not BOOL)   + 2 = 2
    ?>
    

    另外,请查看:php string number concatenation messed up


    <强> UPDv2:

    无论零填充效果如何,PHP都无法将字符串值强制转换为八进制。尽管如此,如前所述,PHP能够将字符串转换为十六进制。

    <?php
    header('Content-Type: text/plain');
    
    function plus($a, $b){
        echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
    }
    
    plus(008, 12);     // Invalid octal, PHP assumes it is 0. Result: 12.
    plus('008', 12);   // Invalid octal? No, it is decimal. Result: 20.
    plus(0x0F, 1);     // Valid hexadecimal. Result: 16.
    plus('0x0F', 1);   // Valid hexadecimal. Result: 16.
    plus('0x0X', 1);   // Invalid hexadecimal, PHP assumes it is 0. Result: 1.
    ?>
    

    string to number conversion ”docs中未提及。

答案 1 :(得分:6)

请参阅PHP Manual Language.types.string.conversion

  

字符串转换为数字

     

在数值上下文中计算字符串时,结果值和类型确定如下。

     

如果字符串不包含任何字符'。','e'或'E',并且数值适合整数类型限制(由PHP_INT_MAX定义),则字符串将被计算为整数。在所有其他情况下,它将被评估为浮动。

     

该值由字符串的初始部分给出。如果字符串以有效数字数据开头,则这将是使用的值。否则,该值将为0(零)。有效数字数据是可选符号,后跟一个或多个数字(可选地包含小数点),后跟可选指数。指数是'e'或'E',后跟一个或多个数字。

示例可以在手册(上面的链接)

中找到
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)

回答你的问题

$a = '5 USD'; //string starts with number so implicit cast to int it will be 5
$b = 10;
echo $a + $b; // = 15

在你编写的另一个例子中

$a = 'USD 5'; //string does not start with number so implicit cast to int it will be 0
$b = 10;
echo $a + $b; // = 10

有关此转换的详细信息,请参阅Unix manual page for strtod(3).

答案 2 :(得分:1)

由于

php > echo (int)"a";
0

所以如果你用

提供php
php > "USD 5" + "10"

它会将两个操作数转换为整数

php > (int)"USD 5" + (int)"10"

因此您将收到0 + 10

的结果