PHP Conference Japan 2024

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) . " 是数字", PHP_EOL;
} else {
echo
var_export($element, true) . " 不是数字", 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) . " 是数字", PHP_EOL;
} else {
echo
var_export($element, true) . " 不是数字", 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

参见

添加注释

用户贡献的注释 7 条注释

sobolanx at gmail dot com
13 年前
请注意,该函数接受极大的数字并正确地评估它们。

例如

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

var_dump ($v);
?>

以上脚本将输出

bool(true)

所以这个函数不会被超大数字吓倒。希望这对某些人有所帮助。

附注:还要注意,如果您写 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
18 年前
对于大于 LONG_MAX 的十六进制值,is_numeric 会失败,因此,如果将一个很大的十六进制值通过 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
21年前
请注意,对于非常长的字符串,此函数不适合检查“is_numeric”。事实上,传递给此函数的所有内容都会先转换为长整型,然后再转换为双精度浮点数。任何大于大约1.8e308的值都太大,无法表示为双精度浮点数,因此会变成无穷大,即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
To Top