我正在寻找一个函数,可以根据字符串的内容将数字字符串转换为整数或浮点类型,例如“1.23” -> 浮点数 1.23,“123” -> 整数 123。
我知道我可以将 if-s 与 is_int、is_float 一起使用并转换为适当的类型 - 但也许有一个函数可以自动执行此操作?
不,没有任何功能提供自动投射。但是,您可以使用这个简单的 hack 进行转换(转换是由 PHP 在内部自动进行的):
$int = "123"+0;
$float = "1.23"+0;
通用号码:
$yourNumberCasted = $yourStringNumber + 0;
具有功能:
function castToNumber($genericStringNumber) {
return $genericStringNumber+0;
}
$yourNumberCasted = castToNumber($yourStringNumber);
您可以使用以下行满足您的要求。
$i = "1.23";
echo $c = (double)$i; // will return 1.23
$i = "123";
echo $c = (double)$i; // will return 123
没有内置函数可以执行此操作,但您可以快速创建自己的函数。
function castNumber($n)
{
if(!is_numeric($n)) return 0;
return (is_float($n)) ? (float) $n : (int) $n;
}
并使用它:
$casted = castNumber($num_to_cast);
这些都不适合我。但这是我的解决方案:
$numString = '1.0';
$intOrFloat = (strpos($numString, '.') !==false) ? floatval($numString) : intval($numString);
如果您的传入值是脏的(例如用户提供的),因此不能保证是数字,从 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;
}
○
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
尽管这个问题很老了,我想为这个问题添加一个新的解决方案。毫无疑问,最好的答案是 antoox 提供的答案,但是正如已经指出的那样,它有一个小缺点......尚不清楚“+ 0”在做什么。
一个不言自明的简洁解决方案是:
$intOrFloat = floatval($str) ? (float)$str : (int)$str;