如何将字符串转换为PHP中的数字?

Sar*_*ara 596 php casting type-conversion

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

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 914

您通常不需要这样做,因为PHP会在大多数情况下强制为您提供类型.对于那些你想显式转换型的情况下,它:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;
Run Code Online (Sandbox Code Playgroud)

  • 根据上下文,假设`.`是小数点分隔符可能不安全.http://en.wikipedia.org/wiki/Decimal_mark#Countries_using_Arabic_numerals_with_decimal_comma (14认同)
  • 这里情况有点不同我想将任何字符串(仅包含数字)转换为一般数字.正如你可能在javaScript中所知,我们可以使用**parseInt()**来转换string => int或parseFloat()来转换string => float.但一般来说javaScript使用Number()来转换string => number.我想在PHP中使用类似的方法吗? (4认同)
  • 当我从一个完整的日期字符串获得一个月号时,它对我来说很有用,我曾经从一个moth names数组中提取一个值.此处不会发生自动转换,因为字符串索引有效,但不等效. (4认同)
  • @Sara:您还可以创建一个函数,将字符串转换为_number_,方法是首先将其转换为整数,然后浮动,然后比较两个值(整数和浮点数)是否相等.如果是,则应将值作为整数返回,否则返回浮点数.希望你明白这个主意. (3认同)
  • 有时您需要将整数传递给文件系统,等待PHP为您完成转换不是一个好主意。 (2认同)

far*_*jad 152

有几种方法可以这样做:

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

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对字符串执行数学运算:

    $num = "10" + 1;
    $num = floor("10.1");
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用intval()floatval():

    $num = intval("10");
    $num = floatval("10.1");
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用settype().

  • 注意`(double)`只是`(float)`的别名. (7认同)
  • @ downvoter,我不知道我的答案有什么问题.请注意,我在OP编辑她的问题之前发布了这个,但是这也涵盖了编辑的问题(`$ num ="10"+ 1`示例). (4认同)
  • `intval`非常有用,因为你可以在`array_map('intval',$ arrayOfStrings)中使用它;`你不能用于转换. (3认同)
  • @ ed-ta:非常确定如果你传递字符串,它将返回min/max值而不是0.即`intval("9999999999")== 2147483647`. (2认同)
  • 最好使用`$ num =“ 10” * 1;“而不是`$ num =” 10“ + 1;`,因为那样的话不会改变值(乘法的中性元素),本质上类似于`toNumber( ..)`,因为最终类型将由转换字符串“ 10”->(int)10所需的条件来确定;“ 10.1”->(浮动)10.1; (2认同)

You*_*nse 47

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

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

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

  • 有许多语言你不能通过添加零来将字符串转换为数字,它通常被认为是错误而不是有效的转换方法:). (35认同)
  • 在javascript中@oriol你需要将数字加到零'0 +'123'以获得`123` (9认同)
  • 注意,在PHP中建议大多数时候使用===样式比较.因此,如果您要比较数据,那么存储它的类型就非常重要. (4认同)
  • honzasp是对的,例如在JavaScript`typeof('123'+ 0)`给`'string'`,因为''123'+ 0`给出''1230'. (3认同)
  • 完善.正是我想要的.添加零解决了我的问题. (2认同)

小智 45

为了避免问题尝试intval($var).一些例子:

<?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
?>
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这是唯一正确的答案,因为它是唯一一个考虑数字字符串的基数的答案.如果数字字符串具有一个或多个前导零,并且该字符串不是具有八进制基数的数字,那么仅使用类型转换的所有响应(即使那些建议用户定义的函数)将会失败. (3认同)

Ale*_*kin 24

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

$number = ($value == (int) $value) ? (int) $value : (float) $value;
Run Code Online (Sandbox Code Playgroud)

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

  • @jchook可能更脏,因为它取决于语言环境-例如'0,4'而不是'0.4'。 (4认同)
  • 只需使用“+”恒等运算符:“var_dump(+'0.4', +'4')”,即可为您提供一个浮点数和一个整数。https://www.php.net/manual/en/language.operators.arithmetic.php (4认同)
  • 可能不那么脏?`strpos($ val,'.')=== false?intval($ val):floatval($ val);` (3认同)
  • @jchook在像`2.1e2`这样的情况下中断,它有小数点,但结果数字是整数 (2认同)

noo*_*php 23

您可以使用:

(int)(your value);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

intval(string)
Run Code Online (Sandbox Code Playgroud)

  • 问题还在于花车. (6认同)
  • 该示例显示了浮点数,它询问如何将数字字符串转换为数值(浮点数和整数) (2认同)

web*_*eat 14

而不必选择是否转换stringintfloat,您只需添加一个0,PHP将自动将结果转换为数字类型.

// 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;
Run Code Online (Sandbox Code Playgroud)


Boy*_*dev 14

你可以随时添加零!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)
Run Code Online (Sandbox Code Playgroud)


Kas*_*han 12

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

  • 不,我想要一个常用的方法.这意味着如果它的'5'=>它应该转换为5并且如果它'2.345'=>它应该转换为2.345. (3认同)

ald*_*ans 12

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

Aritmetic Operators

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

$a = +$a;
Run Code Online (Sandbox Code Playgroud)

  • @Greg - 当然,与大多数其他答案相比,这“更少”是黑客行为。它是一个内置运算符,可以完全按照要求执行操作。(尽管最好首先检查“is_numeric”,因此有一个地方可以放置代码来处理无法正确转换的字符串。) (4认同)
  • @Greg - 我同意任何时候代码做一些对读者来说可能不明显的事情,评论都是值得的!(虽然它仍然不是一个*hack*,因为它的用法正是文档所说的 - 尽管我个人不会知道这一点,所以我很高兴在那里看到评论。) (3认同)

Dra*_*gas 11

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

获得最多支持的答案建议执行以下操作:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3
Run Code Online (Sandbox Code Playgroud)

太精彩了。PHP 进行直接转换。但如果我们执行以下操作呢?

$str = "3.14is_trash"
$intstr = (int)$str
Run Code Online (Sandbox Code Playgroud)

PHP 认为这种转换有效吗?

显然是的

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

如果你要转换为浮动或双倍,也会发生同样的情况。PHP 会读取3, then ., then 1, then 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字符串如何转换为相应的数字

  • `is_numeric($str)` 对此有帮助。(如之前的两个答案所示 - 因此“没有人提到最大的警告”这一说法不太准确 - 尽管我看到没有人详细解释这个问题。) (2认同)

tas*_*enb 10

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

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type
Run Code Online (Sandbox Code Playgroud)


Cog*_*ent 9

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


klo*_*oma 9

如果你想要一个字符串的数值并且你不想将它转换为 float/int 因为你不确定,这个技巧会将它转换为正确的类型:

function get_numeric($val) {
  if (is_numeric($val)) {
    return $val + 0;
  }
  return 0;
}

Example:
<?php
get_numeric('3'); // int(3)
get_numeric('1.2'); // float(1.2)
get_numeric('3.0'); // float(3)
?>
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.php.net/manual/en/function.is-numeric.php#107326

  • `获取数字(010);// int 8` `get_numeric('010'); //整数10` (2认同)

Mik*_*elG 9

好吧,我刚刚遇到了这个问题。我的问题是所讨论的数字/字符串具有不同的位数。有些没有小数点,有些则有几个。所以对我来说,使用intfloatdoubleintvalfloatvalall 根据数字给出了不同的结果。

所以,简单的解决方案...在服务器端将字符串除以 1。这会将其强制转换为数字并保留所有数字,同时删除不必要的 0。它不漂亮,但很有效。

"your number string" / 1

Input       Output
"17"        17
"84.874"    84.874
".00234"    .00234
".123000"   .123
"032"       32
Run Code Online (Sandbox Code Playgroud)


Die*_*itz 6

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

从而:

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

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

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

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

编辑

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

case 'object': return is_callable($mixed)?'function':'object';
Run Code Online (Sandbox Code Playgroud)


ver*_*zim 6

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

基于我在这里看到的关于PHP自动肯不肯来解释一个包含数字串数字(和有关添加注释,因为PHP中的"+"纯粹是为了数学加法),这招乘工作只是正常对于PHP,也是.

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


dru*_*gan 6

除了Boykodev的回答,我建议:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)
Run Code Online (Sandbox Code Playgroud)


小智 6

仅将数字乘以 1,以便将字符串转换为数字类型。

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}
Run Code Online (Sandbox Code Playgroud)

  • 很公平,但是这个方法(和类似的技巧)已经列在这个问题的 24 个其他答案中 - 我看不到再次发布它的价值。 (7认同)
  • 为了让 SO 平台正常工作,现有的答案应该被投票,而不是重复。如果有错别字,请在帖子下方添加评论,或提出建议。SO 平台的运作方式与论坛不同。但这是这个平台价值的一部分。每个平台都有自己的优势。在这种情况下,您可以通过投票来增加价值。或者您可以使用其他参考文献/链接进行评论。另一方面,如果您有一个很棒的、改变游戏规则的解释,而其他人没有提供,您可以添加一个新答案,同时也可以投票并链接到上一篇文章。 (2认同)

Pri*_*tom 5

$a = "10";

$b = (int)$a;
Run Code Online (Sandbox Code Playgroud)

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

  • 如果输入的数字是 '7.2345' 我不能使用 (int) 那么我必须使用 (float)。我需要的是一个通用的解决方案。 (2认同)

小智 5

你可以这样写:

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

  • 虽然此代码可能会回答这个问题,但提供有关此代码为何和/或如何回答问题的其他背景可提高其长期价值. (3认同)

Ben*_*nni 5

聚会迟到了,但这里有另一种方法:

function cast_to_number($input) {
    if(is_float($input) || is_int($input)) {
        return $input;
    }
    if(!is_string($input)) {
        return false;
    }
    if(preg_match('/^-?\d+$/', $input)) {
        return intval($input);
    }
    if(preg_match('/^-?\d+\.\d+$/', $input)) {
        return floatval($input);
    }
    return false;
}

cast_to_number('123.45');       // (float) 123.45
cast_to_number('-123.45');      // (float) -123.45
cast_to_number('123');          // (int) 123
cast_to_number('-123');         // (int) -123
cast_to_number('foo 123 bar');  // false
Run Code Online (Sandbox Code Playgroud)