关于强制转换:如何将字符串转换为PHP中的数字?

How do I convert a string to a number in PHP?

我想将这些类型的值'3''2.34''0.234343'等转换为数字。 在JavaScript中我们可以使用Number(),但PHP中是否有类似的方法?

1
2
3
4
Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545


您通常不需要这样做,因为PHP会在大多数情况下强制为您提供类型。对于您希望显式转换类型的情况,请将其强制转换:

1
2
3
$num ="3.14";
$int = (int)$num;
$float = (float)$num;


有几种方法可以这样做:

  • 将字符串转换为数字原始数据类型:

    1
    2
    $num = (int)"10";
    $num = (double)"10.12"; // same as (float)"10.12";
  • 对字符串执行数学运算:

    1
    2
    $num ="10" + 1;
    $num = floor("10.1");
  • 使用intval()floatval()

    1
    2
    $num = intval("10");
    $num = floatval("10.1");
  • 使用settype()


  • 在任何(松散类型)语言中,您总是可以通过向数字添加零来将字符串强制转换为数字。

    但是,由于PHP在使用此变量时会自动执行此操作,因此在输出时无论如何都将转换为字符串。

    请注意,您可能希望将点分号保持为字符串,因为在转换为浮动之后,由于浮点数的性质,它可能会无法预测地更改。


    为避免出现问题,请尝试intval($var)。一些例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    echo intval(42);                      // 42
    echo intval(4.2);                     // 4
    echo intval('42');                    // 42
    echo intval('+42');                   // 42
    echo intval('-42');                   // -42
    echo intval(042);                     // 34 (octal as starts with zero)
    echo intval('042');                   // 42
    echo intval(1e10);                    // 1410065408
    echo intval('1e10');                  // 1
    echo intval(0x1A);                    // 26 (hex as starts with 0x)
    echo intval(42000000);                // 42000000
    echo intval(420000000000000000000);   // 0
    echo intval('420000000000000000000'); // 2147483647
    echo intval(42, 8);                   // 42
    echo intval('42', 8);                 // 34
    echo intval(array());                 // 0
    echo intval(array('foo', 'bar'));     // 1
    ?>


    您可以使用:

    1
    (int)(your value);

    或者您可以使用:

    1
    intval(string)


    如果你想为$value = '0.4'获得一个浮点数,但是为$value = '4'获取int,你可以写:

    1
    $number = ($value == (int) $value) ? (int) $value : (float) $value;

    它有点脏,但它的工作原理。


    你可以随时添加零!

    1
    2
    3
    4
    Input             Output
    '2' + 0           2 (int)
    '2.34' + 0        2.34 (float)
    '0.3454545' + 0   0.3454545 (float)

    您无需选择是否将string转换为intfloat,而只需向其中添加0,PHP就会自动将结果转换为数字类型。

    1
    2
    3
    4
    5
    // Being sure the string is actually a number
    if (is_numeric($string))
        $number = $string + 0;
    else // Let the number be 0 if the string is not a number
        $number = 0;

    在PHP中,您可以使用intval(string) or floatval(string)函数将字符串转换为数字。


    在某些情况下,只需要注意一些有用且更安全的答案。
    您可能想要先检查字符串是否实际包含有效数值,然后再将其转换为数字类型(例如,如果必须操作来自将int转换为字符串的数据库的数据)。您可以使用is_numeric()然后floatval()

    1
    2
    3
    4
    5
    6
    $a ="whatever"; // any variable

    if (is_numeric($a))
        var_dump(floatval($a)); // type is float
    else
        var_dump($a); // any type

    这是实现您正在寻找的功能。首先,我们检查值是否可以理解为数字,如果是,我们将其转换为int和float。如果int和float是相同的(例如,5 == 5.0),那么我们返回int值。如果int和float不相同(例如,5!= 5.3),那么我们假设您需要float的精度并返回该值。如果该值不是数字,则抛出警告并返回null。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function toNumber($val) {
        if (is_numeric($val)) {
            $int = (int)$val;
            $float = (float)$val;

            $val = ($int == $float) ? $int : $float;
            return $val;
        } else {
            trigger_error("Cannot cast $val to a number", E_USER_WARNING);
            return null;
        }
    }

    是的,在PHP中有一个类似的方法,但是很少有人知道你很少会听到它。它是一个名为"identity"的算术运算符,如下所述:

    Aritmetic Operators

    要将数字字符串转换为数字,请执行以下操作:

    1
    $a = +$a;


    这是我为自己简化的一个函数:

    它还返回boolean,integer,double和real的简写版本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function type($mixed, $parseNumeric = false)
    {        
        if ($parseNumeric && is_numeric($mixed)) {
            //Set type to relevant numeric format
            $mixed += 0;
        }
        $t = gettype($mixed);
        switch($t) {
            case 'boolean': return 'bool'; //shorthand
            case 'integer': return 'int';  //shorthand
            case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
            default: return $t;
        }
    }

    将parseNumeric设置为true的调用类型将在检查类型之前转换数字字符串。

    从而:

    type("5",true)将返回int

    type("3.7",true)将返回float

    type("500")将返回字符串

    请注意,因为这是一种错误的检查方法,您的实际变量仍然是一个字符串。如果需要,您需要将实际变量转换为正确的类型。我只是需要它来检查数据库是否应该加载项ID或别名,因此没有任何意外的影响,因为无论如何它将在运行时被解析为字符串。

    编辑

    如果您想检测对象是否为函数,请将此案例添加到交换机:

    1
    case 'object': return is_callable($mixed)?'function':'object';

    除了Boykodev的回答,我建议:

    1
    2
    3
    4
    Input             Output
    '2' * 1           2 (int)
    '2.34' * 1        2.34 (float)
    '0.3454545' * 1   0.3454545 (float)


    我发现在JavaScript中将字符串转换为数字的简单方法是将其乘以1.它解决了连接问题,因为"+"符号在JavaScript中有多种用法,而"*"符号纯粹是用于数学乘法。

    基于我在这里看到的有关PHP自动愿意将包含数字的字符串解释为数字(以及关于添加的注释,因为在PHP中"+"纯粹用于数学加法),这个乘法技巧工作得很好对于PHP,也是。

    我测试了它,它确实有效......虽然取决于你如何获取字符串,你可能想要在它乘以1之前应用trim()函数。


    你可以这样写:

    1
    2
    3
    4
    <?php
        $data = ["1","2","3","4","5"];
        echo json_encode($data, JSON_NUMERIC_CHECK);
    ?>


    1
    2
    3
    $a ="10";

    $b = (int)$a;

    您可以使用它将字符串转换为PHP中的int。


    您可以使用:

    1
    ((int) $var)   ( but in big number it return 2147483647 :-) )

    但最好的解决方案是使用:

    1
    2
    3
    4
    if (is_numeric($var))
        $var = (isset($var)) ? $var : 0;
    else
        $var = 0;

    要么

    1
    2
    3
    4
    if (is_numeric($var))
        $var = (trim($var) == '') ? 0 : $var;
    else
        $var = 0;

    PHP将在限制范围内为您完成

    1
    2
    3
    4
    5
    6
    7
    <?php
       $str ="3.148";
       $num = $str;

       printf("%f
    "
    , $num);
    ?>


    所有建议都会丢失数字类型。

    在我看来这是一个最好的做法:

    1
    2
    3
    4
    5
    6
    7
    function str2num($s){
    // Returns a num or FALSE
        $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
        print"
    ret=$return_value type="
    .gettype($return_value)."
    "
    ;
    }

    您可以按如下方式更改数据类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $number ="1.234";

    echo gettype ($number) ."
    "
    ; //Returns string

    settype($number ,"float");

    echo gettype ($number) ."
    "
    ; //Returns float

    由于历史原因,在浮动的情况下返回"double"。

    PHP文档


    有一种方法:

    1
    $value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

    使用is_*将不起作用,因为variable是:string

    使用json_encode()然后json_decode()的组合,它将转换为它的"真实"形式。如果它是真的string则输出错误。

    1
    2
    3
    4
    5
    $num ="Me";
    $int = (int)$num;
    $float = (float)$num;

    var_dump($num, $int, $float);

    将输出:string(2)"Me" int(0) float(0)


    我得到了一个问题"你说你正在编写用于在PHP中将字符串转换为字符串的内置函数,在编程访谈中如何编写该函数"。这是一个解决方案。

    1
    2
    3
    4
    5
    6
    7
    8
    $nums = ["0","1","2","3","4","5","6","7","8","9"];
    $int = 15939;
    $string ="";
    while ($int) {
        $string .= $nums[$int % 10];
        $int = (int)($int / 10);
    }
    $result = strrev($string);

    我一直在阅读答案,并没有看到有人提到PHP的数字转换中最大的警告。

    最受欢迎的答案建议执行以下操作:

    1
    2
    $str ="3.14"
    $intstr = (int)$str // now it's a number equal to 3

    太精彩了。 PHP确实直接投射。但是,如果我们做了以下怎么办?

    1
    2
    $str ="3.14is_trash"
    $intstr = (int)$str

    PHP认为此类转换有效吗?

    显然是的。

    PHP读取字符串,直到找到所需类型的第一个非数字字符。这意味着对于整数,数字字符是[0-9]。结果,它读取3,因为它在[0-9]字符范围内,它继续读取。读取.并停在那里,因为它不在[0-9]范围内。

    如果您要转换为浮动或双倍,也会发生同样的情况。 PHP将读取3,然后是.,然后是1,然后是4,并且将停在i,因为它不是有效的浮点数字符。

    因此,"million">= 1000000的计算结果为false,但"1000000million">= 1000000的计算结果为true

    也可以看看:

    https://www.php.net/manual/en/language.operators.comparison.php比较时如何进行转换

    https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion如何将字符串转换为相应的数字


    不同的方法:

  • 将它全部推入数组/关联数组。
  • json_encode($your_array, JSON_NUMERIC_CHECK);可选择将其解码
  • 利润!