is_numeric

(PHP 4、PHP 5、PHP 7、PHP 8)

is_numeric查找变量是否为数字或数字字符串

说明

is_numeric(混合类型 $value): 布尔型

确定给定变量是否为数字或 数字字符串

参数

value

要评估的变量。

返回值

如果 value 是数字或 数字字符串,则返回 true,否则返回 false

变更日志

版本 说明
8.0.0 以空格结尾的数字字符串("42 ")现在将返回 true。以前,返回的是 false

示例

示例 #1 is_numeric() 示例

<?php
$tests
= array(
"42",
1337,
0x539,
02471,
0b10100111001,
1337e0,
"0x539",
"02471",
"0b10100111001",
"1337e0",
"not numeric",
array(),
9.1,
null,
'',
);

foreach (
$tests as $element) {
if (
is_numeric($element)) {
echo
var_export($element, true) . " is numeric", PHP_EOL;
} else {
echo
var_export($element, true) . " is NOT numeric", PHP_EOL;
}
}
?>

以上示例将输出

'42' is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337.0 is numeric
'0x539' is NOT numeric
'02471' is numeric
'0b10100111001' is NOT numeric
'1337e0' is numeric
'not numeric' is NOT numeric
array (
) is NOT numeric
9.1 is numeric
NULL is NOT numeric
'' is NOT numeric

示例 #2 带有空格的 is_numeric()

<?php
$tests
= [
" 42",
"42 ",
"\u{A0}9001", // 不间断空格
"9001\u{A0}", // 不间断空格
];

foreach (
$tests as $element) {
if (
is_numeric($element)) {
echo
var_export($element, true) . " is numeric", PHP_EOL;
} else {
echo
var_export($element, true) . " is NOT numeric", PHP_EOL;
}
}
?>

PHP 8 中以上示例的输出

' 42' is numeric
'42 ' is numeric
' 9001' is NOT numeric
'9001 ' is NOT numeric

PHP 7 中以上示例的输出

' 42' is numeric
'42 ' is NOT numeric
' 9001' is NOT numeric
'9001 ' is NOT numeric

参见

添加备注

用户贡献的备注 8 则备注

sobolanx at gmail dot com
13 年前
请注意,该函数接受非常大的数字并正确地对其进行评估。

例如

<?php
$v
= is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;

var_dump ($v);
?>

以上脚本将输出

bool(true)

所以此函数不会被超级大的数字吓倒。我希望这对某人有所帮助。

PS:还要注意,如果您写 is_numeric (45thg),这将生成解析错误(因为参数未包含在单引号或双引号之间)。在使用此函数时请牢记这一点。
tanguy_barsik at hotmail dot com
7 年前
对于字符串,它仅在浮点数有小数点时返回 true

is_numeric( '42.1' )//true
is_numeric( '42,1' )//false
moskalyuk at gmail dot com
17 年前
is_numeric 在大于 LONG_MAX 的十六进制值上失败,因此将大型十六进制值解析通过 is_numeric 将导致返回 FALSE,即使该值是有效的十六进制数字
ben at chico dot com
10 年前
显然,NAN(非数字)对于 is_numeric() 来说是一个数字。

<?php
echo "is ";
if (!
is_numeric(NAN))
echo
"not ";
echo
"a number";
?>

输出 "is a number"。所以,从定义上来说不是数字的东西是数字……
kouber at saparev dot com
20 年前
请注意,此函数不适合检查非常长的字符串的 "is_numeric"。实际上,传递给此函数的所有内容都将转换为 long,然后转换为 double。任何大于大约 1.8e308 的内容都对 double 来说太大,因此它会变成无穷大,即 FALSE。这意味着,对于每个超过 308 个字符的字符串,is_numeric() 将返回 FALSE,即使所有字符都是数字。

但是,此行为是平台特定的。

https://php.net/manual/en/language.types.float.php

在这种情况下,可以使用正则表达式

function is_numeric_big($s=0) {
return preg_match('/^-?\d+$/', $s);
}
Magnus Deininger, dma05 at web dot de
15 年前
关于全球和美式数字表示法,需要注意的是,至少在日语中,数字不是每三位数用一个额外的符号分组,而是每四位数分组(例如 1,0000 而不是 10.000)。 另外,Nadim 的正则表达式在某一点略有不完善,因为有一个未转义的 '.' 运算符,整个表达式可以轻松地合并成一个正则表达式(速度等等)。

调整

<?php
$eng_or_world
= preg_match
('/^[+-]?'. // 开始标记和符号前缀
'(((([0-9]+)|([0-9]{1,4}(,[0-9]{3,4})+)))?(\\.[0-9])?([0-9]*)|'. // 美式
'((([0-9]+)|([0-9]{1,4}(\\.[0-9]{3,4})+)))?(,[0-9])?([0-9]*))'. // 全球
'(e[0-9]+)?'. // 指数
'$/', // 结束标记
$str) == 1;
?>

我确信这仍然不是最佳的,但它也应该涵盖日语风格的数字,并且它修复了其他正则表达式中的一些其他问题。 它还允许使用指数后缀,小数点前的数字是可选的,并且它强制使用分组或非分组整数部分。 应该更容易根据您的喜好进行修剪。
Katrina Kizenbach
1 年前
请注意,对于使用小数点的数字字符串,is_numeric() 将评估为 false。

is_numeric('0.11');
输出:true

is_numeric('0,11');
输出:false
anantkumarsingh03101988 at gmail dot com
1 年前
示例 #2

输出

'9001 ' 不是数字

对于 PHP8 不正确,它是数字。

所以请更正这一点。
To Top