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

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

提问人:Sara 提问时间:12/16/2011 最后编辑:YanDatsiukSara 更新时间:12/5/2022 访问量:2804314

问:

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

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545
PHP 强制转换 转换

评论

99赞 Matthieu Napoli 7/9/2013
读者请注意:这个问题没有真正的答案:(
1赞 Kellen Stuart 5/27/2016
@MatthieuNapoli 答案是,通常 Php 会帮你解决它——这是动态类型系统的好处之一。
18赞 person27 2/7/2017
伴随着所有的不确定性和“通常”的链条。
0赞 Matthieu Napoli 4/30/2018
我想我 5 年前的意思是,没有一个函数接受字符串并返回正确的 or(当给出 an 时,您通常不想要)。intfloatfloatint
4赞 stubsthewizard 9/21/2018
@MatthieuNapoli 我很高兴你澄清了你的观点,这意味着给猫剥皮的方法不止一种,而不是没有办法做到这一点。例如,强制转换在数据库操作中非常重要。例如,在参数化 PDO 查询中,解析器有时会很难意识到它是一个数字而不是字符串,然后您最终在整数字段中得到 0,因为您没有在参数步骤中将字符串转换为 int。

答:

0赞 Adrian Cornish 12/16/2011 #1

PHP将在一定范围内为您完成

<?php
   $str = "3.148";
   $num = $str;

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

评论

0赞 Sara 12/16/2011
我不想说出来。我想转换它并将其保存在变量中。
1赞 Adrian Cornish 12/16/2011
这会自动将其转换为浮点数。PHP 的松散类型转换可以为您完成。尽管它可能无法达到您的预期,但其他具有显式转换的答案可能更适合您。
0赞 Sara 12/16/2011
$str可以使用 printf(“%f\n”, $str) 包含 '5' 或 '5.258',则 '5' 将输出为 5.000000(我希望它是 5),对于 5.280000(我希望它是 5.28),它包含更多的小数点。
0赞 ToolmakerSteve 8/14/2020
回复“这会自动将其转换为浮点数。”没用。 当然,根本没有改变值。printf 在某处打印了一些东西 - 所以它仍然是一个字符串。如果您改用,这可能会更明显!在您的答案中,没有任何地方可以提取并在其他地方使用的浮点值。[同意内部暂时是一个浮动 - 但仍然不是问题的答案。如果 OP 想打印原始字符串,他可以简单地完成。$num = $str;sprintfprintf("%s\n", $str)
22赞 Kashif Khan 12/16/2011 #2

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

评论

6赞 Sara 12/16/2011
不,我想要一个通用的方法。这意味着如果它的 '5' = >它应该转换为 5,如果它的 '2.345' =>它应该转换为 2.345。
0赞 Kamlesh 3/27/2022
对我不起作用,它将“3”转换为 0 零。
261赞 fardjad 12/16/2011 #3

有几种方法可以做到这一点:

  1. 将字符串强制转换为数字基元数据类型:

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

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

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

评论

16赞 deceze 12/16/2011
请注意,这只是 的别名。(double)(float)
5赞 fardjad 12/16/2011
@downvoter,我不知道我的答案有什么问题。请注意,我在 OP 编辑她的问题之前发布了这个,但是这也涵盖了编辑后的问题(示例)。$num = "10" + 1
2赞 riv 7/29/2015
@ed-ta:非常确定,如果您将字符串传递给它,它将返回最小/最大值而不是 0。即.intval("9999999999")==2147483647
6赞 icc97 11/24/2016
intval很有用,因为这样你就可以在铸造无法做到的地方使用它。array_map('intval', $arrayOfStrings);
3赞 Holly 8/20/2017
与其使用它更好,因为这不会改变值(乘法的中性元素),这本质上是这样的,因为最终类型将由转换字符串“10”-> (int) 10 所需的内容决定;“10.1” -> (浮动) 10.1;$num = "10" + 1;$num = "10" * 1;toNumber(..)
5赞 Pritom 12/16/2011 #4
$a = "10";

$b = (int)$a;

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

评论

2赞 Sara 12/16/2011
如果输入的数字是“7.2345”,我不能使用(int),那么我必须使用(float)。我需要的是一个通用的解决方案。
1赞 Pritom 12/16/2011
您始终可以使用 double 或 float。
1418赞 deceze 12/16/2011 #5

您通常不需要这样做,因为在大多数情况下,PHP 会强制您输入类型。对于确实要显式转换类型的情况,请强制转换它:

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

评论

9赞 Sara 12/16/2011
这里的情况有点不同,我想将任何字符串(仅包含数字)转换为一般数字。正如 U 可能知道的那样,在 javaScript 中,我们可以使用 parseInt() 来转换 string=>int 或 parseFloat() 来转换 string=>float。但一般来说,javaScript 使用 Number() 将字符串 => 数字。我想要在php中使用类似的方法吗?
4赞 Cazuma Nii Cavalcanti 1/31/2013
当我从完整的日期字符串中获得月份编号时,它对我来说很有用,我曾经从飞蛾名称数组中提取一个值。此处不会发生自动转换,因为字符串索引是有效的,但不是等效的。
35赞 Dave Jarvis 2/23/2014
根据上下文,假定这是小数点分隔符可能不安全。en.wikipedia.org/wiki/.......
4赞 Youstay Igo 8/4/2016
@Sara:您还可以创建一个函数,用于将字符串转换为数字,方法是先将其转换为整数,然后转换为浮点数,然后比较两个值(整数和浮点数)是否相等。如果是,则应将值作为整数返回,如果不是,则以浮点数形式返回。希望你明白这个主意。
3赞 AaA 1/27/2019
有时您需要将整数传递给文件系统,等待PHP为您进行转换并不是一个好主意。
25赞 noobie-php 12/16/2011 #6

您可以使用:

(int)(your value);

或者,您可以使用:

intval(string)

评论

0赞 Sara 12/16/2011
如果输入的数字是“2.3456”,我如何得到 2.3456?
10赞 taseenb 9/8/2013
问题也与浮子有关。
0赞 noobie-php 9/8/2013
向我显示 OP 的 1 行,上面写着浮动?在通过评论和反对投票之前,请查看原始帖子。
4赞 taseenb 9/8/2013
该示例显示了浮点数,它询问如何将数字字符串转换为数值(浮点数和整数)
1赞 ToolmakerSteve 10/10/2019
@MartinvanDriel - 它不是一个数字。它是一个字符串。问题是如何从字符串中获取 int 或 float 结果(视情况而定)。is_float不会为字符串返回 false 吗?
51赞 Your Common Sense 12/16/2011 #7

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

然而,这没有什么意义,因为 PHP 会在使用此变量时自动执行此操作,并且在输出时无论如何都会将其转换为字符串。

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

评论

40赞 Jan Špaček 1/4/2013
在许多语言中,您不能通过添加零来将字符串转换为数字,这通常被认为是错误而不是有效的:)转换方法。
5赞 Oriol 2/25/2013
honzasp 是对的,例如在 JavaScript 中给出 ,因为给出 .typeof('123'+0)'string''123'+0'1230'
5赞 Jonathon 3/15/2013
注意,在PHP中建议大多数时候使用===样式比较。因此,如果您要比较数据,那么它以何种类型存储可能非常重要。
14赞 Timo Huovinen 6/22/2013
@oriol 在 JavaScript 中,您需要将数字与零相加才能得到0+'123'123
1赞 riv 7/29/2015
@JonathonWisnoski:如果您使用 < 或 >,则更为重要,因为它对数字和字符串具有不同的含义(即“10”<“2”,但 10 > 2)。
14赞 taseenb 8/11/2013 #8

只是对在某些情况下可能有用且更安全的答案的一点说明。 您可能希望首先检查字符串是否实际上包含有效的数值,然后才将其转换为数值类型(例如,如果您必须操作来自将 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

评论

0赞 Daryl 6/12/2021
这是这里的第一个好答案。以上都是BS和危险的,因为'''intval(“4C775916”) => 4'''可能会给你带来一个讨厌的错误。
2赞 David Lozano 9/4/2013 #9

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

$number = "1.234";

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

settype($number , "float");

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

由于历史原因,在浮点数的情况下返回“double”。

PHP 文档

3赞 Mehdi Ajdari 9/30/2013 #10

您可以使用:

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

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

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;
6赞 Dieter Gribnitz 1/24/2014 #11

这是我编写的一个函数,用于为自己简化事情:

它还返回布尔值、整数、双精度和实数的简写版本。

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) 将返回浮点数

type(“500”) 将返回字符串

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

编辑

如果要检测对象是否为函数,请将以下情况添加到交换机中:

case 'object': return is_callable($mixed)?'function':'object';
5赞 vernonner3voltazim 2/25/2014 #12

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

基于我在这里看到的关于PHP自动愿意将包含数字的字符串解释为数字(以及关于加法的评论,因为在PHP中“+”纯粹用于数学加法),这个乘法技巧也适用于PHP。

我已经测试过了,它确实有效......尽管根据您获取字符串的方式,您可能希望在乘以 1 之前对其应用 trim() 函数。

评论

0赞 ToolmakerSteve 8/14/2020
当然,在PHP中,乘法技巧的工作原理与加法技巧完全相同 - 但警告完全相同 - 因此没有任何特别的理由要求计算机进行乘法运算。无论如何,最干净的解决方案是 -- 身份运算符。$var = +$str;
93赞 gopeca 6/2/2014 #13

为了避免出现问题,请尝试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 8/27/2016
恕我直言,这是唯一的正确答案,因为它是唯一一个考虑数字字符串基数的答案。如果数字字符串具有一个或多个前导零,并且该字符串不打算用作具有八进制基数的数字,则仅使用类型转换的所有响应(即使是那些建议用户定义函数的响应)都将失败。
0赞 Agnes Palit 11/28/2019
知道我想将“12.7896”转换为吗?12.7896
0赞 gopeca 11/29/2019
使用 floatval() 将字符串转换为浮点数。floatval(“12.7896”) 将返回 12.7896
0赞 Giacomo Alzetta 2/6/2020
为什么这不是公认的答案?作为一个PHP局外人,我已经知道这是行不通的,因为我专门处理字符串,喜欢,我想解释为以10为基数......因此,我想要一种方法来明确地提供基础。(int)$my_str01013
30赞 Aleksei Akireikin 9/15/2014 #14

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

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

它有点脏,但它有效。

评论

3赞 jchook 4/21/2016
可能不那么脏?strpos($val, '.') === false ? intval($val) : floatval($val);
4赞 Nick Rice 4/28/2017
@jchook 可能更脏,因为它依赖于语言环境 - 例如“0,4”而不是“0.4”。
4赞 Tomáš Blatný 9/18/2019
@jchook在像这样的情况下中断,它有小数点,但结果数字是整数2.1e2
1赞 jchook 9/24/2019
@TomášBlatný 不,它没有。在 PHP 中,计算结果为 false。您可能混淆了“float”和“包含小数部分的数字”......显然是一个浮点数,在PHP中是一个浮点数。试试吧。浮点数与数字存储在RAM中并表示为数字文字的方式有关。210.02.1e2
4赞 tvanc 11/7/2019
只需使用标识运算符:,就会得到一个浮点数和一个整数 php.net/manual/en/language.operators.arithmetic.php+var_dump(+'0.4', +'4')
1赞 Rocco Galasso 4/30/2015 #15

所有建议都将丢失数值类型。

在我看来,这似乎是一种最佳实践:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}
41赞 webNeat 6/3/2015 #16

您不必选择是否将 转换为 或 ,只需向其添加 a,PHP 就会自动将结果转换为数值类型。stringintfloat0

// 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;

评论

0赞 Polymath 8/24/2022
这对我来说是有用的,只能将数字字段转换为 JSON 数字
0赞 Pavel Železný 11/10/2022
完美的解决方案,允许在一行中将字符串转换为整数和浮点数,而无需检查它是否包含分隔符。太好了,谢谢
12赞 CogSciGradStudent 1/2/2016 #17

这是实现您正在寻找的功能的功能。首先,我们检查该值是否可以理解为一个数字,如果可以,我们将其转换为 int 和一个浮点数。如果 int 和 float 相同(例如,5 == 5.0),那么我们返回 int 值。如果 int 和 float 不相同(例如,5 != 5.3),那么我们假设您需要浮点数的精度并返回该值。如果该值不是数字,我们将抛出警告并返回 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;
    }
}
21赞 Boykodev 7/18/2016 #18

你总是可以给它加零!

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

评论

0赞 Agnes Palit 11/28/2019
我收到这个错误。有什么想法吗?A non well formed numeric value encountered
0赞 VishalParkash 8/24/2020
这太神奇了,我从来没有读过这样的东西。对我的知识有很好的补充
8赞 drugan 10/3/2016 #19

除了博伊科杰夫的回答之外,我还建议:

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

评论

0赞 Boykodev 10/3/2016
稍微考虑了一下,我也可以建议除以 1 :)
1赞 drugan 10/6/2016
这是一点!:)顺便说一句,您的解决方案比上述所有科学记数法都要好得多。谢谢。
0赞 inMILD 5/2/2018
这个解决方案解决了我的问题。就我而言,而不是 $target_id_cron = (int)$id_cron - 1;$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
1赞 Agnes Palit 11/28/2019
当我想将字符串更改为浮点时,我收到了此错误。有什么建议吗?A non well formed numeric value encountered$num = '12,24' * 1
0赞 ToolmakerSteve 8/14/2020
@AgnesPalit - 以盎格鲁为中心。仅识别为小数点分隔符。尝试。虽然我个人更喜欢.加法而不是乘法。PHP.'12.24' * 1+ 0
-2赞 Brendan 1/19/2018 #20

在一次编程采访中,我遇到了一个问题:“假设你正在编写用于在 PHP 中将整数转换为字符串的内置函数,您将如何编写该函数”。这是一个解决方案。

$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);

评论

0赞 ToolmakerSteve 8/14/2020
感谢您尝试为问答做出贡献。但是,对不起,不是问题中问的。您的代码将整数转换为字符串。问题是关于将字符串转换为整数。问题也不在于如何编写代码来执行已经可以使用该语言的内置功能完成的事情。
38赞 aldemarcalazans 5/11/2018 #21

是的,PHP 中也有类似的方法,但它鲜为人知,以至于您很少听说过它。它是一个称为“标识”的算术运算符,如下所述:

Aritmetic 运算符

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

$a = +$a;

评论

0赞 Greg 8/21/2019
警告:检测到黑客攻击。
1赞 aldemarcalazans 8/23/2019
嗨,@Greg。您是否点击了此处发布的链接?这是开发人员对这个运算符的评价:根据需要将 $a 转换为 int 或 float。这里的“转换”不能理解为数字到数字的转换。为什么?因为从排他性算术的角度来看,这个算子绝对没用!将任何数字乘以“+1”(相当于恒等函数)对它绝对没有影响。因此,除了此处建议的类型转换之外,我无法想象此运算符的其他实用程序。
4赞 ToolmakerSteve 10/10/2019
@Greg - 当然,与大多数其他答案相比,这不是一个黑客。它是一个内置运算符,可以完全按照请求执行操作。(尽管最好先检查一下,所以要有一个地方来放置代码来处理无法正确转换的字符串。is_numeric
0赞 Greg 10/10/2019
我知道使用算术运算符进行强制转换非常有效,但真的很容易错过。我认为这值得警告。
3赞 ToolmakerSteve 8/14/2020
@Greg - 我同意,任何时候代码都会做一些对读者来说可能不明显的事情,评论是值得的!(虽然它仍然不是黑客,因为它的用法正是文档所说的 - 尽管我个人不会知道这一点,所以我很高兴看到那里的评论。
3赞 Dominic Amal Joe F 8/28/2018 #22

简单地说,你可以这样写:

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

评论

3赞 Alex Riabov 8/28/2018
虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文可以提高其长期价值。
1赞 Nico Haase 12/29/2018
你确定吗?这不会将字符串转换为数字,而是将数组转换为 JSON 字符串
0赞 Dominic Amal Joe F 1/3/2019
是的,@NicoHaase如果数组中的数字是字符串格式,它将转换为数字。
3赞 Anuga 5/29/2019 #23

有一种方法可以:

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

使用 将不起作用,因为 是 a: .is_*variablestring

使用 和 的组合,然后将其转换为“真实”形式。如果它是 true,那么它将输出错误。json_encode()json_decode()string

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

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

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

评论

0赞 ToolmakerSteve 8/14/2020
毫无疑问,这是真的。但是荒谬的矫枉过正的方法来解决几年前已经提供了简单解决方案的问题。(只是庆幸你没有早点写 - 用同样的方法看到非常反对的答案)。
11赞 Dragas 6/16/2019 #24

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

投票最多的答案建议执行以下操作:

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

这太棒了。PHP 是直接强制转换的。但是,如果我们执行以下操作呢?

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

PHP 是否认为这种转换有效?

显然是

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

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

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

另请参阅:

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

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

评论

1赞 th3pirat3 7/4/2020
这是一个很好的答案。我做了一些工作,并为相同的 tutes.in/php-caveats-int-float-type-conversion 编写了一些测试
2赞 ToolmakerSteve 8/14/2020
is_numeric($str)对此有所帮助。(正如前面的两个答案所示 - 所以“没有人提到最大的警告”并不完全准确 - 尽管我看到没有人详细解释这个问题。
7赞 rolodef 11/2/2019 #25

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

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

评论

8赞 DavidW 11/3/2019
很公平,但这种方法(和类似的技巧)已经列在这个问题的其他 24 个答案中 - 我看不出再次发布它的价值。
1赞 SherylHohman 6/18/2020
例如,stackoverflow.com/a/39832873/5411817 3 年前就提出了同样的技巧。
2赞 SherylHohman 6/18/2020
为了使 SO 平台正常工作,应对现有答案进行点赞,而不是重复。如果有错别字,请在帖子下方添加评论或建议。SO 平台的运作方式与论坛不同。但这是这个平台价值的一部分。每个平台都有其优势。在这种情况下,您将通过投票来增加价值。或者您可以使用其他参考/链接进行评论。另一方面,如果你有一个很棒的、改变游戏规则的解释,没有其他人提供,你可以添加一个新的答案,同时还可以投票并链接到上一篇文章。
2赞 user1657853 2/13/2020 #26

如果您事先不知道您有浮点数还是整数,
并且字符串可能包含特殊字符(如空格、€ 等),
并且它可能包含超过 1 个点或逗号,
则可以使用此函数:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

评论

0赞 ToolmakerSteve 8/14/2020
就个人而言,我认为这是可疑的。获取任意的、垃圾的字符串并在其中搜索一个数字,几乎可以肯定是不可取的。最好做 php 默认做的事情,即将(大多数)垃圾字符串转换为“0”。原因:如果意外的字符串到达您的方法,则发生的事情更明显 - 您只需得到 0(除非字符串以有效数字开头)。
1赞 user1657853 9/8/2020
@ToolmakerSteve是的,这是有问题的,但至少在这个用例中,我别无选择:我必须“按原样”显示包含在(不可修改的)工作表中的字符串,带有符号等,同时使用其中包含的数字。
0赞 ToolmakerSteve 9/9/2020
好吧,这是有道理的。如果字符串中散布着多个数字,您的答案会怎么做?此方法对于仅将电话号码转换为数字的代码有用吗?例如,用户输入,你想从中提取吗?或者它找到第一个数字的想法,所以会导致我的例子?(123)456-78901234567890123
1赞 user1657853 9/9/2020
它返回完整的数字
1赞 Zahid Gani 9/10/2020 #27
//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123
5赞 Benni 9/10/2020 #28

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

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

评论

0赞 Zrin 3/25/2022
注意:这缺少对输入的处理,例如“.123”、“123.”、“1.23e6”以及可能的其他输入(“0x16”等)。
1赞 hackernewbie 9/25/2020 #29

实现它的众多方法之一是:

$fileDownloadCount          =  (int) column_data_from_db;
$fileDownloadCount++;

第二行将该值递增 1。

14赞 klodoma 9/29/2020 #30

如果你想要一个字符串的数值,并且因为你不确定而不想将其转换为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)
?>

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

评论

2赞 vralle 4/7/2022
get_numeric(010); // int 8 get_numeric('010'); // int 10
0赞 Samantra 12/18/2022
@vralle,八进制文字被php解释器解析为整数值8;这不是一种可以在运行时完成的转换。010
4赞 Andy 8/22/2021 #31

现在我们正处于一个严格/强类型在PHP中具有更大重要性的时代,我使用:json_decode

$num = json_decode('123');

var_dump($num); // outputs int(123)

$num = json_decode('123.45');

var_dump($num); // outputs float(123.45)

评论

0赞 TV-C-1-5 3/16/2022
JSON 不是 PHP
3赞 Andy 3/16/2022
@TV-C-1-5 不确定你说的重点?当然,JSON不是PHP。PHP 提供了对 JSON 进行编码和解码的函数。以同样的方式,PHP 提供了编码和解码 base64 的功能——这并不意味着 base64 PHP。
0赞 lisandro 3/24/2023
我需要检查 POSTed 值是否为整数,它非常适合此。
9赞 MikelG 10/21/2021 #32

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

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

"your number string" / 1

Input       Output
"17"        17
"84.874"    84.874
".00234"    .00234
".123000"   .123
"032"       32

评论

0赞 MJ DLS 11/14/2021
它支持哪些浏览器?
0赞 MikelG 11/16/2021
这是在服务器端完成的
0赞 MJ DLS 11/17/2021
哦,好的,但是请问您可以在所有浏览器或某些浏览器中使用此代码吗?
0赞 MikelG 11/18/2021
呃......正如我所说,这段代码是针对服务器端的。问题是PHP的,它是服务器端执行。
0赞 borma425 12/6/2022
尝试回声“3.80”/1时;#output 3.8
4赞 Hef 4/11/2022 #33
function convert_to_number($number) {
    return is_numeric($number) ? ($number + 0) : FALSE;
}
1赞 F.K. Juliano 10/15/2022 #34

使用一元运算符 (+)。例如:

$n1 = +'7';
$n2 = '2.34';
$n2 = +$n1;

var_dump($n 1): 整数(7) var_dump($n 2): 浮点数(2.34)

评论

1赞 lisandro 3/24/2023
它将所有内容转换为数字,字母变为 0。
0赞 ksenija 12/5/2022 #35

您只需将 0 添加到字符串中,即可将其转换为数字,而不会丢失初始原始值。举个例子:

dd('0.3454545' + 0)

PHP 将为您处理转换,或者按照已经建议的在字符串前添加 +。