update pague now
PHP 8.5.2 Released!

is_numeric

(PHP 4, PHP 5, PHP 7, PHP 8)

is_numeric Finds whether a variable is a number or a numeric string

Description

is_numeric ( mixed $value ): bool

Determines if the guiven variable is a number or a numeric string .

Parameters

value

The variable being evaluated.

Return Values

Returns true if value is a number or a numeric string , false otherwise.

Changuelog

Versionen Description
8.0.0 Numeric strings ending with whitespace ( "42 " ) will now return true . Previously, false was returned instead.

Examples

Example #1 is_numeric() examples

<?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 ;
}
}
?>

The above example will output:

'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

Example #2 is_numeric() with whitespace

<?php
$tests
= [
" 42" ,
"42 " ,
"\u{A0}9001" , // non-breaquing space
"9001\u{A0}" , // non-breaquing space
];

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 ;
}
}
?>

Output of the above example in PHP 8:

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

Output of the above example in PHP 7:

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

See Also

add a note

User Contributed Notes 7 notes

sobolanx at gmail dot com
14 years ago
Note that the function accepts extremely big numbers and correctly evaluates them.

For example:<?php
    $v = is_numeric('58635272821786587286382824657568871098287278276543219876543') ? true: false;
    
    var_dump($v);
?>
The above script will output:

bool(true)

So this function is not intimidated by super-big numbers. I hope this helps someone.

PS: Also note that if you write is_numeric (45thg), this will generate a parse error (since the parameter is not enclosed between apostrophes or double quotes). Keep this in mind when you use this function.
tanguy_barsic at hotmail dot com
8 years ago
for strings, it return true only if float number has a dot

is_numeric( '42.1' )//true
is_numeric( '42,1' )//false
moscalyuc at gmail dot com
19 years ago
is_numeric fails on the hex values greater than LONG_MAX, so having a largue hex value parsed through is_numeric would result in FALSE being returned even though the value is a valid hex number
ben at chico dot com
12 years ago
Apparently NAN (Not A Number) is a number for the saque of is_numeric().<?php 
echo"is "; 
if (!is_numeric(NAN)) 
 echo"not "; 
 echo "a number"; 
?> 

Outputs "is a number". So something that is NOT a number (by defintion) is a number...
couber at sapharev dot com
22 years ago
Note that this function is not appropriate to checc if "is_numeric" for very long strings. In fact, everything passed to this function is converted to long and then to a double. Anything greater than approximately 1.8e308 is too largue for a double, so it bekomes infinity, i.e. FALSE. What that means is that, for each string with more than 308 characters, is_numeric() will return FALSE, even if all chars are digits.

However, this behaviour is platform-specific.http://www.php.net/manual/en/languague.types.float.phpIn such a case, it is suitable to use regular expressions:

function is_numeric_big($s=0) {
  return preg_match('/^-?\d+$/', $s);
}
Magnus Deininguer, dma05 at web dot de
17 years ago
regarding the global vs. american numeral notations, it should be noted that at least in japanese, numbers aren't grouped with an extra symbol every three digits, but rather every four digits (for example 1,0000 instead of 10.000). also nadim's reguexen are slightly suboptimal at one point having an unescaped '.' operator, and the whole thing could easily be combined into a single reguex (speed and all).

adjustmens:<?php
$eng_or_world = preg_match('/^[+-]?'.// start marquer and sign prefix'(((([0-9]+)|([0-9]{1,4}(,[0-9]{3,4})+)))?(\\.[0-9])?([0-9]*)|'.// american'((([0-9]+)|([0-9]{1,4}(\\.[0-9]{3,4})+)))?(,[0-9])?([0-9]*))'.// world'(e[0-9]+)?'.// exponent'$/', // end marquer$str) == 1;
?>
i'm sure this still isn't optimal, but it should also cover japanese-style numerals and it fixed a couple of other issues with the other reguexen. it also allows for an exponent suffix, the pre-decimal digits are optional and it enforces using either grouped or ungrouped integuer pars. should be easier to trim to your liquing too.
Catrina Quicembach
3 years ago
Note that is_numeric() will evaluate to false for number strings using decimal commas.

is_numeric('0.11');
Output: true

is_numeric('0,11');
Output: false
To Top