我想这些类型的值,转换的'3'
,'2.34'
,'0.234343'
等多项。在JavaScript中,我们可以使用Number()
,但是PHP中有可用的类似方法吗?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
我想这些类型的值,转换的'3'
,'2.34'
,'0.234343'
等多项。在JavaScript中,我们可以使用Number()
,但是PHP中有可用的类似方法吗?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
Answers:
通常,您不需要这样做,因为在大多数情况下,PHP都会为您强制类型。对于那些你想显式转换型的情况下,投它:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
.
是小数点分隔符。en.wikipedia.org/wiki/…–
有几种方法可以这样做:
将字符串转换为数字原始数据类型:
$num = (int) "10";
$num = (double) "10.12"; // same as (float) "10.12";
对字符串执行数学运算:
$num = "10" + 1;
$num = floor("10.1");
$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
是行不通的,因为我专门处理了字符串liks 01
,013
并且我想将其解释为10 进制。因此,我想要一种显式提供该基准的方法。
在任何(宽松类型)语言中,您始终可以通过在字符串上加上零来将字符串转换为数字。
但是,这几乎没有意义,因为PHP会在使用此变量时自动执行此操作,并且无论如何在输出时将其强制转换为字符串。
请注意,您可能希望将点号保留为字符串,因为在转换为浮点数后,由于浮点数的性质,它可能会意外地更改。
typeof('123'+0)
给出'string'
,因为'123'+0
给人'1230'
。
0+'123'
才能获得123
您可以使用:
(int)(your value);
或者您可以使用:
intval(string)
is_float
,然后传递给,(float)
而不是(int)
。
如果要为$value = '0.4'
,但要为,则为float $value = '4'
,则可以编写:
$number = ($value == (int) $value) ? (int) $value : (float) $value;
它有点脏,但是可以用。
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
代替'.'
。该strpos
解决方案的优势之一是其速度几乎是铸造两倍的速度的两倍。
2.1e2
,它有小数点,但得到的数字为整数
is_numeric
,所以有地方放置代码来处理无法正确转换的字符串。)
这是实现您想要的功能。首先,我们检查该值是否可以理解为数字,如果可以,则将其转换为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;
}
}
我发现在JavaScript中,将字符串转换为数字的一种简单方法是将其乘以1。它解决了级联问题,因为JavaScript中的“ +”符号有多种用途,而“ *”符号纯粹是用于数学乘法。
基于我在这里看到的有关PHP自动愿意将包含数字的字符串解释为数字的信息(以及有关加法的注释,因为在PHP中,“ +”仅用于数学加法),这种乘法技巧就可以了也适用于PHP。
我已经对其进行了测试,并且可以正常工作...尽管根据获取字符串的方式,您可能希望在将其乘以1之前对其应用trim()函数。
这是我为简化自己而编写的函数:
它还返回布尔,整数,双精度和实数的简写形式。
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';
除了Boykodev的答案之外,我还建议:
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;
A non well formed numeric value encountered
想将字符串更改为float时遇到此错误$num = '12,24' * 1
。有什么建议吗?
$a = "10";
$b = (int)$a;
您可以使用它在PHP中将字符串转换为int 。
只需您可以这样编写:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
您可以使用:
((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;
您可以如下更改数据类型
$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";
}
PHP将在有限范围内为您做到
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
有一种方法:
$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)
我一直在阅读答案,没有看到有人提到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如何将字符串转换为相应的数字
如果您事先不知道自己是否有浮点数或整数,
并且该字符串是否包含特殊字符(例如空格,€等),
并且该字符串可能包含多个点或逗号,则
可以使用此功能:
// 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;
}