将字符串转换为整数或浮点数

17

我正在寻找一个函数,它可以将数字字符串转换为整数或浮点数类型,具体取决于字符串的内容,例如,“1.23”->浮点数1.23,“123”->整数123。

我知道我可以使用if-s与is_int、is_float和cast到适当类型 - 但也许有一个函数可以自动完成此操作吗?

8个回答

41

不,没有任何函数可以提供自动转换。但是你可以使用这个简单的技巧进行强制类型转换(PHP在内部会自动进行转换):

$int = "123"+0;
$float = "1.23"+0;

对于通用数字:

$yourNumberCasted = $yourStringNumber + 0;

使用一个函数:

function castToNumber($genericStringNumber) { 
    return $genericStringNumber+0; 
}
$yourNumberCasted = castToNumber($yourStringNumber);

这是一个非常有趣的解决方案。我一开始考虑使用“三元运算符”来检测“.”的存在,然后使用(int)(float)。你的解决方案非常优雅,但我倾向于在代码中加注释,因为它对读者来说并不明显它的作用。 - Karl M.W.
2
如果您愿意,可以创建一个名为“castToNumber”的函数。function castToNumber($genericStringNumber) { return $genericStringNumber+0; } - antoox
1
请注意,使用此方法时,非常大的整数将根据系统的PHP_INT_MAX设置转换为浮点数。 - Rogier

2
您可以使用以下代码满足您的需求。
 $i = "1.23";       
 echo $c = (double)$i; // will return 1.23

 $i = "123";       
 echo $c = (double)$i; // will return 123

1

没有内置函数可以完成这个任务,但你可以快速地创建自己的函数。

function castNumber($n)
{
   if(!is_numeric($n)) return 0;
   return (is_float($n)) ? (float) $n : (int) $n;
}

并使用它:

$casted = castNumber($num_to_cast);

大致上,这就是我所拥有的。我只是希望有类似于内置的东西。 - ducin
1
我总是有一个 Utils.php 文件,当没有内置函数满足我的需求时,我会在其中添加这样的函数,然后在我的应用程序中重复使用它。 - letiagoalves
就像 JavaScript 的 underscore.js 一样 ;) - ducin
7
由于is_float()在字符串上始终返回false,因此该函数将始终将数字字符串转换为整数。 - ShaneOH
也许如果你把返回行改成 return (is_float($n + 0)) ? (float) $n : (int) $n;,它会更好地工作。 - CsZsombor

0

function castToNumber1($genericStringNumber) { 
    return ((int)$genericStringNumber == (float)$genericStringNumber)
        ? (int)$genericStringNumber
        : (float)$genericStringNumber; 
}

×

function castToNumber2($genericStringNumber) { 
    return is_numeric($genericStringNumber) ? $genericStringNumber + 0 : 0;
}

糟糕的情况

// $hoge is float
$hoge = castToNumber2(1.2E+2); // 120

0

这些方法都对我无效。但是这是我的解决方案:

$numString = '1.0'; $intOrFloat = (strpos($numString, '.') !==false) ? floatval($numString) : intval($numString);


这个程序是“严格的”,遵循我们的编码标准;-) - Jan Tlapák

0

如果您的输入值是脏数据(例如用户提供的),因此不能保证为数字,在 PHP 8.0 中,接受的解决方案将生成Fatal error: Uncaught TypeError: Unsupported operand types: string + int,而以前只是一个警告。

您可以在其中放置一个is_numeric()并为非数字提供显式的0值。

function castToNumber($genericStringNumber) { 
    return is_numeric($genericStringNumber) ? $genericStringNumber + 0 : 0
}

或者您可以使用类似以下的方式进行显式转换:
function castToNumber($genericStringNumber) { 
    return ((int)$genericStringNumber == (float)$genericStringNumber)
        ? (int)$genericStringNumber
        : (float)$genericStringNumber; 
}

0
虽然这个问题很旧,但我想为这个问题添加一个新的解决方案。毫无疑问,antoox提供的答案是最好的,然而,正如已经指出的,它有一个小缺点...不清楚"+ 0"是做什么的。
一个简洁明了的解决方案是:
$intOrFloat = floatval($str) ? (float)$str : (int)$str;

-1

有一个函数intval(),它几乎与其他答案中提到的类型转换相同,但不能用于对象。

还有具有相同功能的函数:boolval()floatval()


我不想要int类型,而是int或float类型。 - ducin
好的,那么使用添加 0(或乘以 1)的技巧。 - Voitcus

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