我想将这些类型的值 '3'
、'2.34'
、'0.234343'
等转换为数字。在 JavaScript 中我们可以使用 Number()
,但在 PHP 中有没有类似的方法可用?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
int
或 float
(你通常不想要 float
时int
给出)。
您通常不需要这样做,因为 PHP 在大多数情况下会为您强制类型。对于您确实想要显式转换类型的情况,cast 它:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
有几种方法可以做到这一点:
将字符串转换为数字原始数据类型: $num = (int) "10"; $num = (double) "10.12"; // 等同于 (float) "10.12";对字符串执行数学运算:$num = "10" + 1; $num = 楼层(“10.1”);使用 intval() 或 floatval(): $num = intval("10"); $num = floatval("10.1");使用 settype()。
(double)
只是 (float)
的别名。
$num = "10" + 1
示例)。
intval("9999999999")==2147483647
。
intval
很有用,因为这样您就可以在 array_map('intval', $arrayOfStrings);
中使用它,而这是投射无法做到的。
$num = "10" + 1;
,最好使用 $num = "10" * 1;
,因为这不会改变值(乘法的中性元素),这本质上类似于 toNumber(..)
,因为最终类型将由转换字符串所需的内容决定“ 10" -> (int) 10; “10.1”-> (浮动)10.1;
为避免出现问题,请尝试 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
?>
12.7896
,知道吗?
(int)$my_str
行不通,因为我专门处理我想解释为基数为 10 的字符串,如 01
和 013
...所以我想要一种明确提供基础的方法。
在任何(松散类型)语言中,您始终可以通过向其添加零来将字符串转换为数字。
但是,这没什么意义,因为 PHP 会在使用此变量时自动执行此操作,并且在输出时无论如何都会将其转换为字符串。
请注意,您可能希望将虚线数字保留为字符串,因为在转换为浮点数后,由于浮点数的性质,它可能会发生不可预测的变化。
typeof('123'+0)
给出 'string'
,因为 '123'+0
给出 '1230'
。
0+'123'
才能获得 123
无需选择是将 string
转换为 int
还是 float
,您只需添加一个 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;
是的,在 PHP 中也有类似的方法,但它鲜为人知,以至于您很少会听到它。它是一个称为“身份”的算术运算符,如下所述:
要将数字字符串转换为数字,请执行以下操作:
$a = +$a;
is_numeric
,所以有一个地方放置代码来处理无法正确转换的字符串。)
如果您想获得 $value = '0.4'
的浮点数,但 $value = '4'
的整数,您可以编写:
$number = ($value == (int) $value) ? (int) $value : (float) $value;
它有点脏,但它有效。
strpos($val, '.') === false ? intval($val) : floatval($val);
2.1e2
等情况下中断,它有小数点,但结果数字是整数
210.0
是浮点数,而在 PHP 中 2.1e2
是浮点数。试试看。浮点数与数字存储在 RAM 中并表示为数字文字的方式有关。
+
标识运算符:var_dump(+'0.4', +'4')
,为您提供一个浮点数和一个整数。 php.net/manual/en/language.operators.arithmetic.php
您可以使用:
(int)(your value);
或者您可以使用:
intval(string)
在 PHP 中,您可以使用 intval(string) or floatval(string)
函数将字符串转换为数字。
您可以随时添加零!
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
。任何想法?
只需注意在某些情况下可能有用且更安全的答案。您可能希望首先检查字符串是否实际上包含有效的数值,然后才将其转换为数值类型(例如,如果您必须操作来自将整数转换为字符串的数据库的数据)。您可以使用 is_numeric()
,然后使用 floatval()
:
$a = "whatever"; // any variable
if (is_numeric($a))
var_dump(floatval($a)); // type is float
else
var_dump($a); // any type
这是实现您正在寻找的功能。首先我们检查该值是否可以理解为数字,如果可以,我们将其转换为 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;
}
}
如果你想要一个字符串的数值并且你不想将它转换为浮点/整数,因为你不确定,这个技巧会将它转换为正确的类型:
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
get_numeric(010); // int 8
get_numeric('010'); // int 10
除了 Boykodev's answer,我还建议:
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
而不是 $target_id_cron = (int)$id_cron - 1;
$num = '12,24' * 1
时出现此错误 A non well formed numeric value encountered
。有什么建议吗?
PHP
以盎格鲁为中心。仅将 .
识别为小数分隔符。试试 '12.24' * 1
。虽然我个人更喜欢+ 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/en/language.operators.comparison.php 比较时如何完成转化
https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion 如何将字符串转换为相应的数字
is_numeric($str)
对此有所帮助。 (如两个较早的答案所示 - 所以“没有人提到最大的警告”并不十分准确 - 尽管我看到没有人详细解释这个问题。)
这是我为自己简化事情而编写的一个函数:
它还返回布尔、整数、双精度和实数的速记版本。
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 将在检查类型之前转换数字字符串。
因此:
type("5", true) 将返回 int
type("3.7", true) 将返回浮点数
type("500") 将返回字符串
请小心,因为这是一种错误检查方法,您的实际变量仍将是一个字符串。如果需要,您需要将实际变量转换为正确的类型。我只需要它来检查数据库是否应该加载项目 ID 或别名,因此不会产生任何意外影响,因为无论如何它都会在运行时被解析为字符串。
编辑
如果您想检测对象是否是函数,请将这种情况添加到开关中:
case 'object': return is_callable($mixed)?'function':'object';
仅将数字乘以 1,以便将字符串转换为数字类型。
//String value
$string = "5.1"
if(is_numeric($string)){
$numeric_string = $string*1;
}
我发现在 JavaScript 中将字符串转换为数字的一种简单方法是将其乘以 1。它解决了连接问题,因为“+”符号在 JavaScript 中有多种用途,而“*”符号纯粹是用于数学乘法。
根据我在这里看到的关于 PHP 自动愿意将包含数字的字符串解释为数字的内容(以及关于添加的评论,因为在 PHP 中“+”纯粹用于数学加法),这个乘法技巧工作得很好对于 PHP,也是。
我已经对其进行了测试,它确实有效......尽管取决于您获取字符串的方式,您可能希望在乘以 1 之前对其应用 trim() 函数。
$var = +$str;
- 身份运算符。
迟到了,但这里有另一种方法:
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
好吧,我刚刚遇到了这个问题。我的问题是有问题的数字/字符串具有不同的位数。有些没有小数,有些有几个。所以对我来说,使用 int
、float
、double
、intval
或 floatval
都会根据数量给我不同的结果。
所以,简单的解决方案......将字符串除以 1 服务器端。这会强制它为一个数字并保留所有数字,同时修剪不必要的 0。它不漂亮,但它有效。
"your number string" / 1
Input Output
"17" 17
"84.874" 84.874
".00234" .00234
".123000" .123
"032" 32
$a = "10";
$b = (int)$a;
您可以使用它在 PHP 中将字符串转换为 int。
您可以使用:
((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;
简单地你可以这样写:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
有一种方法:
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
使用 is_*
将不起作用,因为 variable
是:string
。
使用 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)
您可以按如下方式更改数据类型
$number = "1.234";
echo gettype ($number) . "\n"; //Returns string
settype($number , "float");
echo gettype ($number) . "\n"; //Returns float
由于历史原因,在浮点数的情况下返回“double”。
所有建议都会丢失数字类型。
在我看来,这似乎是一个最佳实践:
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 个点或逗号,您可以使用这个功能:
// 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;
}
(123)456-7890
,您想从中提取 1234567890
?还是它找到第一个数字的想法,所以在我的示例中会导致 123
?
//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123
它可以实现的众多方法之一是:
$fileDownloadCount = (int) column_data_from_db;
$fileDownloadCount++;
第二行将值增加 1。
现在我们正处于一个严格/强类型在 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)
.
是小数点分隔符可能不安全。 en.wikipedia.org/wiki/…