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

927

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

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

99
读者请注意:这个问题并没有一个真正的答案 :( - Matthieu Napoli
1
@MatthieuNapoli 答案是通常情况下Php会为您解决这个问题 - 动态类型系统的一个好处。 - Kellen Stuart
18
面对不确定性和“通常”的种种羁绊。 - person27
我认为5年前我的意思是,没有一个单一的函数可以将字符串转换为正确的intfloat(当给定int时,通常不需要float)。 - Matthieu Napoli
4
@MatthieuNapoli很高兴你澄清了自己的观点,意思是有多种方法可以解决问题,而不是根本无法解决。例如在数据库操作中,类型转换非常重要。例如,在参数化PDO查询中,有时解析器难以识别它是数字而不是字符串,然后因为没有在参数步骤中将字符串转换为整数,所以最终会得到一个0放入整型字段中。 - stubsthewizard
顺便提一下,在JavaScript中,字面整数2被内部存储为Number:"JavaScript代码中的数字字面量(如37)是浮点值,而不是整数。在日常使用中没有单独的整数类型。(JavaScript现在有一个BigInt类型,但它并不是为了取代Number而设计的。37仍然是一个Number,而不是BigInt。)"因此,在JS中,Number(your_string)之所以能够实现你想要的功能,是因为其他地方的逻辑默认将2显示为"2"而不是"2.0" - ToolmakerSteve
35个回答

1417

在大多数情况下,你通常不需要这样做,因为PHP会在大多数情况下自动转换类型。但是在你需要显式地转换类型的情况下,可以使用强制转换

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

9
这里的情况有点不同,我想将任何只包含数字的字符串转换为一般数字。如您所知,在 JavaScript 中,我们可以使用 parseInt() 将字符串转换为整型,或使用 parseFloat() 将字符串转换为浮点型。但是在一般情况下,JavaScript 使用 Number() 将字符串转换为数字。我想在 PHP 中找到一个类似的方法? - Sara
4
当我从完整日期字符串中获得一个月份数字时,这对我非常有用,我用它来从月份数组中获取一个值。这里不会发生自动转换,因为字符串索引是有效的但不等价的。 - Cazuma Nii Cavalcanti
35
根据语境,假设“.”是十进制分隔符可能不安全。参见http://en.wikipedia.org/wiki/Decimal_mark#Countries_using_Arabic_numerals_with_decimal_comma。 - Dave Jarvis
4
@Sara:你也可以创建一个函数将字符串转换为“数值”,首先将其转换为整数,然后转换为浮点数,并比较整数和浮点数是否相等。如果相等,就返回整数值,否则返回浮点值。希望你明白了。 - Youstay Igo
3
有时候你需要将整数传递给文件系统,等待PHP帮你进行转换并不是一个好主意。 - AaA
显示剩余5条评论

261

有几种方法可以实现:

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

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

    $num = "10" + 1;
    $num = floor("10.1");
    
  3. 使用intval()floatval()函数:

  4. $num = intval("10");
    $num = floatval("10.1");
    
  5. 使用settype()函数。


16
请注意,(double) 只是 (float) 的别名。 - deceze
5
@downvoter,我不知道我的回答有什么问题。请注意,我在问题编辑之前发布了这个回答,但是它也适用于编辑后的问题(例如$num = "10" + 1的示例)。 - fardjad
2
@ed-ta:我很确定如果你传递字符串给它,它会返回最小/最大值而不是0。例如:intval("9999999999")==2147483647 - riv
6
intval 很有用,因为你可以在 array_map('intval', $arrayOfStrings); 中使用它,而使用强制转换是做不到的。 - icc97
3
与其使用 $num = "10" + 1;,使用 $num = "10" * 1; 更好,因为这不会改变值(乘法的中性元素),本质上类似于 toNumber(..)。最终类型将由需要将字符串转换为整数或浮点数来确定,例如:"10" -> (int) 10;"10.1" -> (float) 10.1。 - Holly
显示剩余4条评论

93
为避免问题,请尝试使用 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
?>

8
在我看来,这是唯一正确的答案,因为它是唯一一个考虑数值字符串基数的答案。所有其他答案(即使建议使用用户自定义函数的答案)仅使用类型转换,如果数字字符串具有一个或多个前导零,并且该字符串不是以八进制基数表示的数字,则会失败。 - Syntax Junkie
有什么想法,如果我想将“12.7896”转换为12.7896 - Agnes Palit
使用 floatval() 将字符串转换为浮点数。floatval("12.7896") 将返回 12.7896。 - gopeca
为什么这不是被接受的答案呢?作为一个 PHP 外行人,我已经知道 (int)$my_str 不会起作用,因为我正在处理像 01013 这样的字符串,我希望将它们解释为十进制...所以我想要一种明确提供基数的方法。 - Giacomo Alzetta

51

无论是什么(弱类型)语言,您都可以通过在字符串后添加零将其转换为数字。

然而,这样做很少有意义,因为PHP会在使用该变量时自动进行转换,并且在输出时它将被转换为字符串。

请注意,您可能希望将带小数点的数字保留为字符串,因为在转换为浮点数后,由于浮点数的性质,可能会发生不可预测的变化。


40
许多语言不允许通过在字符串前添加零来将其转换为数字,通常被视为错误而非有效的转换方法 :)。 - Jan Špaček
5
Honzasp是正确的,例如在JavaScript中,typeof('123'+0)会返回'string',因为'123'+0的结果是 '1230' - Oriol
5
注意,在 PHP 中,推荐大部分时间使用 === 的比较方式。因此,如果您要比较数据,则存储的数据类型非常重要。 - Jonathon
14
在 JavaScript 中,你需要将数字加零 0+'123' 才能得到 123 - Timo Huovinen
1
@JonathonWisnoski:如果你使用 < 或 >,那么更重要的是它对于数字和字符串有不同的含义(例如,“10”<“2”,但10>2)。 - riv
显示剩余5条评论

41

不必选择将 string 转换为 intfloat,你可以直接加上 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;

这对我很有用,可以将仅包含数字的字段转换为数字并转换为JSON。 - Polymath
完美的解决方案,可以在一行代码中将字符串转换为整数和浮点数,无需检查它是否包含分隔符。太好了,谢谢。 - Pavel Železný

38

是的,PHP 中有一个类似的方法,但它很少被人知道,你很少会听说。它是一个被称为“identity”的算术运算符,可以在这里找到相关说明:

算术运算符

要将一个数字字符串转换成数字,请按照以下步骤操作:

$a = +$a;

警告:检测到黑客攻击。 - Greg
1
嗨,@Greg。你点击了这里发布的链接吗?这就是开发人员对该运算符所说的话:“将$a转换为适当的int或float。” 这里的“转换”不能被理解为数字到数字的转换。为什么?因为从独占算术的角度来看,这个运算符是绝对没有用处的!把任何数字乘以“+1”(等同于恒等函数)不会对它产生任何影响。因此,我无法想象除了这里建议的类型转换之外还有其他的用途。 - aldemarcalazans
4
@Greg - 毋庸置疑,相对于其他大部分答案而言,这个解决方案更少涉及黑客行为。这是一个内置运算符,正好符合所需求。(不过最好先检查 is_numeric 函数,以便有一个地方可以放置处理无法正确转换的字符串的代码。) - ToolmakerSteve
我知道使用算术运算符进行强制转换是完美的,但很容易忽略。我认为这值得警告。 - Greg
3
@Greg - 我同意,每当代码执行某些对读者来说不太明显的操作时,加上注释是值得的!(虽然它仍然不是一个hack,因为它的使用方式正是文档所说的 - 尽管我个人可能不知道,所以我很高兴在那里看到注释。) - ToolmakerSteve

30
如果您想要在 $value = '0.4' 的情况下得到一个浮点数,但在 $value = '4' 的情况下得到整数,您可以编写以下代码:
$number = ($value == (int) $value) ? (int) $value : (float) $value;

它有点脏,但它能用。


3
可能不那么脏?strpos($val, '.') === false ? intval($val) : floatval($val); - jchook
4
可能更加不干净,因为它依赖于语言环境——例如使用“0,4”代替“0.4”。 - Nick Rice
4
这段话的意思是:“@jchook的代码在处理像2.1e2这样的情况时出现了问题。虽然这个数字有小数点,但最终结果应该是整数。” - Tomáš Blatný
1
@TomášBlatný 不是这样的。在PHP中,它会被计算为false。你可能把“浮点数”和“包含小数部分的数字”混淆了...显然,210.0是一个浮点数,在PHP中,2.1e2也是一个浮点数。尝试一下吧。浮点数与在RAM中存储数字以及表示为数字文字的方式有关。 - jchook
4
只需使用+身份运算符:var_dump(+'0.4',+'4'),将给出一个浮点数和一个整数。https://www.php.net/manual/en/language.operators.arithmetic.php - tvanc
显示剩余4条评论

25

你可以使用:

(int)(your value);

或者你可以使用:

intval(string)

如果输入的数字是'2.3456',我该如何得到2.3456? - Sara
10
这个问题也涉及到浮点数。 - taseenb
在评论和点踩之前,请看一下原帖,给我展示一下原帖中哪一行写了float? - noobie-php
4
示例展示了浮点数,问题是如何将数字字符串转换为数字值(浮点数和整数)。 - taseenb
首先使用 is_float 检查数字是否为浮点数,如果通过检查,则使用 (float) 进行强制转换,而不是使用 (int) - Martin van Driel
1
@MartinvanDriel - 这不是一个数字,而是一个字符串。问题是如何从字符串中获取适当的int或float结果。is_float函数对于一个字符串会返回false吗? - ToolmakerSteve

22

PHP 中,你可以使用 intval(string) 或者 floatval(string) 函数将字符串转换为数字。


6
我希望你能提供一种通用的方法。这意味着如果输入是 '5' => 它应该转换为 5,如果输入是 '2.345' => 它应该转换为 2.345。 - Sara
对我来说没有用,它把“3”转换成了0。 - Kamlesh

21

您总是可以将零加入其中!

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

我遇到了这个错误 A non well formed numeric value encountered。你有什么想法吗? - Agnes Palit
这太神奇了,我从未读过这样的东西。对我的知识增添了很大帮助。 - VishalParkash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接