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


670

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

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

62
读者注意:这个问题没有真正的答案:(
Matthieu Napoli

@MatthieuNapoli答案是,通常Php会为您找出答案-动态类型系统的好处之一。
科洛布峡谷

12
与所有不确定性链和“通常”。
person27年

2
@MatthieuNapoli类型转换不是“真正的答案”吗?如果您想成为一个婴儿,甚至可以在打字后检查类型
Kolob Canyon

3
@MatthieuNapoli我很高兴您澄清自己的观点,这意味着有多种方法可以给猫做皮毛,而不是没有办法。例如,转换在数据库操作中非常重要。例如,在参数化的PDO查询中,解析器有时会发现它是一个数字而不是字符串,这会很费力,然后您在整数字段中以0结尾,因为您没有将字符串强制转换为int在参数步骤中。
stubsthewizard 18/09/20

Answers:


1031

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

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

4
这里的情况有点不同,我想将任何字符串(仅包含数字)转换为通用数字。正如您在javaScript中可能知道的那样,我们可以使用parseInt()转换string => int或parseFloat()转换string => float。但通常在javaScript中,使用Number()转换字符串=>数字。我想要在php中类似的方法吗?
萨拉

4
当我有一个从完整日期字符串中获得的月份数时,这对我很有用,而我曾经从蛾名数组中提取一个值。由于字符串索引有效,但不是等效的,因此此处不会进行自动强制转换。
Cazuma Nii Cavalcanti

19
根据上下文,可能不安全地假定它.是小数点分隔符。en.wikipedia.org/wiki/…–
Dave Jarvis

3
@Sara:您还可以创建一个将字符串转换为数字的函数,方法是先将其转换为整数,然后转换为浮点,然后比较两个值(整数和浮点)是否相等。如果是,则应将值返回为整数,如果不是,则返回浮点数。希望你能明白。
Youstay Igo

2
有时您需要将整数传递给文件系统,等待PHP为您完成转换不是一个好主意。
AaA

173

有几种方法可以这样做:

  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()


9
请注意,这(double)只是的别名(float)
deceze

4
@downvoter,我不知道我的答案有什么问题。请注意,我在OP编辑她的问题之前就发布了此内容,但这也涵盖了已编辑的问题($num = "10" + 1示例)。
fardjad 2011年

2
@ ed-ta:可以肯定的是,如果将字符串传递给它,它将返回最小值/最大值而不是0。即intval("9999999999")==2147483647
riv

6
intval之所以有用,是因为您可以在array_map('intval', $arrayOfStrings);铸造时无法使用的地方使用它。
icc97 '16

2
而不是$num = "10" + 1;它的更好的使用$num = "10" * 1;,因为这不会改变的值(乘法中性元素),这基本上是类似的东西toNumber(..),因为最终类型将需要转换字符串什么来决定“10” - >(INT)10; “ 10.1”->(浮动)10.1;
冬青

57

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

4
恕我直言,这是唯一正确的答案,因为它是唯一考虑数字字符串基数的答案。如果数字字符串具有一个或多个前导零,并且该字符串不打算用作具有八进制基数的数字,则所有仅使用类型转换的响应(甚至那些暗示用户定义函数的响应)都将失败。
语法Junkie

我是否想将“ 12.7896”转换为12.7896
艾格尼丝·帕利特

使用floatval()将字符串转换为float。floatval(“ 12.7896”)将返回12.7896
gopeca '19

为什么这不是公认的答案?作为一个PHP局外人,我已经知道那(int)$my_str是行不通的,因为我专门处理了字符串liks 01013并且我想将其解释为10 进制。因此,我想要一种显式提供该基准的方法。
Giacomo Alzetta

48

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

但是,这几乎没有意义,因为PHP会在使用此变量时自动执行此操作,并且无论如何在输出时将其强制转换为字符串。

请注意,您可能希望将点号保留为字符串,因为在转换为浮点数后,由于浮点数的性质,它可能会意外地更改。


35
在许多语言中,您无法通过添加零将字符串转换为数字,通常将其视为错误,而不是有效的转换方法:)。
2013年

4
honzasp是正确的,例如在JavaScript中typeof('123'+0)给出'string',因为'123'+0给人'1230'
Oriol

5
注意,在PHP中,建议大多数时候使用===样式比较。所以,如果你将你的比较数据可它是什么类型存储是非常重要的。
乔纳森

请注意,通过添加零,您并不是真正意义上的“广播”,您基本上是在转换。
CSᵠ

12
@oriol在JavaScript中,您需要将数字添加为零0+'123'才能获得123
Timo

24

您可以使用:

(int)(your value);

或者您可以使用:

intval(string)

如果输入的数字是“ 2.3456”,我怎么会得到2.3456?
萨拉

6
这个问题也与花车有关。
taseenb

向我显示OP的1行,上面显示“ float”?在通过评论和否决票之前,请查看原始帖子。
noobie-php 2013年

2
该示例显示了浮点数,它询问如何将数字字符串转换为数值(浮点数和整数)
taseenb 2013年

首先检查数字是否为is_float,然后传递给,(float)而不是(int)
Martin van Driel

24

如果要为$value = '0.4',但要为,则为float $value = '4',则可以编写:

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

它有点脏,但是可以用。


3
可能不那么脏?strpos($val, '.') === false ? intval($val) : floatval($val);
jchook '16

4
@jchook可能更脏,因为它取决于语言环境-例如'0,4'而不是'0.4'。
尼克·赖斯

好点子。我想您可以用localeconv()['decimal_point']代替'.'。该strpos解决方案的优势之一是其速度几乎是铸造两倍的速度的两倍。
jchook

2
@jchook,打破案件一样2.1e2,它有小数点,但得到的数字为整数
托马什Blatný

1
只需使用+身份运算符:var_dump(+'0.4', +'4'),即可为您提供浮点数和整数。php.net/manual/en/language.operators.arithmetic.php
tvanc

15

您可以随时添加零!

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。任何的想法?
艾格尼丝·帕利特

15

无需选择是否将转换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;

13

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


4
不,我想要一个通用方法。这意味着如果它的'5'=>应该转换为5,如果它的'2.345'=>应该转换为2.345。
萨拉

13

是的,PHP中有一个类似的方法,但鲜为人知,因此您很少会听说。这是一个称为“ 标识 ” 的算术运算符,如下所述:

算术运算符

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

$a = +$a;

警告:侦测到骇客。
格雷格,

嗨,格雷格。您是否单击此处发布的链接?这就是开发人员对此运算符的评价:将$ a适当地转换为int或float。在此,“转换”不能理解为数字到数字的转换。为什么?因为从专有算术的角度来看,该运算符绝对没有用!任何数字乘以“ +1”(等同于身份函数)对它绝对没有影响。因此,除了这里建议的类型转换,我无法想象该操作符还有其他实用程序。
aldemarcalazans

@格雷格-这确是一个黑客,比大多数其他的答案。它是一个内置的运算符,可以完全执行所要求的操作。(尽管最好首先检查一下is_numeric,所以有地方放置代码来处理无法正确转换的字符串。)
ToolmakerSteve

我知道使用算术运算符进行强制转换非常有效,但是确实很容易错过。我认为这值得警告。
格雷格

11

在某些情况下,仅对可能有用且更安全的答案做一点说明即可。您可能需要先检查字符串是否真正包含有效的数字值,然后才将其转换为数字类型(例如,如果您必须处理来自将整数转换为字符串的db的数据)。您可以使用is_numeric()然后floatval()

$a = "whatever"; // any variable

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

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

6

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

基于我在这里看到的有关PHP自动愿意将包含数字的字符串解释为数字的信息(以及有关加法的注释,因为在PHP中,“ +”仅用于数学加法),这种乘法技巧就可以了也适用于PHP。

我已经对其进行了测试,并且可以正常工作...尽管根据获取字符串的方式,您可能希望在将其乘以1之前对其应用trim()函数。


6

这是我为简化自己而编写的函数:

它还返回布尔,整数,双精度和实数的简写形式。

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或别名,因此不会有任何意外的影响,因为无论如何它将在运行时解析为字符串。

编辑

如果要检测对象是否为函数,请将这种情况添加到开关中:

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

6

除了Boykodev的答案之外,我还建议:

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

稍微考虑一下之后,我还建议除以1 :)
Boykodev

1
这就是重点!:)顺便说一句,您的解决方案比上面的所有科学符号要好得多。谢谢。
drugan

这个解决方案解决了我的问题。就我而言,$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;不是$ target_id_cron =(int)$ id_cron-1;
inMILD

1
A non well formed numeric value encountered想将字符串更改为float时遇到此错误$num = '12,24' * 1。有什么建议吗?
艾格尼丝·帕利特

5
$a = "10";

$b = (int)$a;

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


2
如果输入的数字是“ 7.2345”,则我不能使用(int),那么我必须使用(float)。我需要的是一个通用的解决方案。
萨拉

1
您可以始终使用double或float。
Pritom 2011年

5

只需您可以这样编写:

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

3
尽管此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以提高其长期价值。
Alex Riabov

1
你确定吗?这不会将字符串转换为数字,而是将数组转换为JSON字符串
Nico Haase

是的,@ NicoHaase如果数字在数组中为字符串格式,它将转换为数字。
Dominic Amal Joe F

5

仅将数字乘以1即可将字符串转换为数字类型。

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

相当公平,但是此方法(和类似技巧)已在此问题的其他24个答案中列出-我看不到再次发布它的价值。
DavidW

4

您可以使用:

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

2

您可以如下更改数据类型

$number = "1.234";

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

settype($number , "float");

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

由于历史原因,在浮动情况下会返回“ double”。

PHP文档


2

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

在我看来,这是一种最佳做法:

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";
}

1

PHP将在有限范围内为您做到

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

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

我不想说出来。我想将其转换并将其保存在变量中。
萨拉

1
这自动将其转换为浮点数。PHP的松散类型转换可以帮您实现。尽管它可能无法满足您的期望,但其他带有显式转换的答案可能对您更好。
Adrian Cornish

$ str可以使用printf(“%f \ n”,$ str)包含'5'或'5.258',其中包含的5.280000(我希望它为5.28)的输出结果为5.000000(我希望它为5)更多小数点。
萨拉

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()其转换为“真实”形式。如果为true,string则输出错误。

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

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

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


0

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

$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

我一直在阅读答案,没有看到有人提到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]。结果,3由于它处于[0-9]字符范围内,因此它会继续读取。.由于不在[0-9]范围内,因此在此处读取并停止。

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

结果,"million" >= 1000000评估为false,但"1000000million" >= 1000000评估为true

也可以看看:

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

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


0

如果您事先不知道自己是否有浮点数或整数,
并且该字符串是否包含特殊字符(例如空格,€等),
并且该字符串可能包含多个点或逗号,则
可以使用此功能:

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

-8

不同的方法:

  1. 将其全部推送到数组/关联数组中。
  2. json_encode($your_array, JSON_NUMERIC_CHECK); 可以选择解码回去
  3. 利润!

7
堆栈溢出是关于问题的答案,而不是笑话。我确定那里有一个地方,但是不是这个地方。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.