Numeric strings
A PHP string is considered numeric if it can be interpreted as an int or a float.
A PHP string is considered numeric if it can be interpreted as an int or a float.
Formally as of PHP 8.0.0:
WHITESPACES \s*
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})PHP also has a concept of leading numeric strings. This is simply a string which starts like a numeric string followed by any characters.
Any string that contains the letter E (case insensitive) bounded by numbers will be seen as a number expressed in scientific notation. This can produce unexpected results.
Scientific Notation Comparisons
<?php
var_dump("0D1" == "000"); // false, "0D1" is not scientific notation
var_dump("0E1" == "000"); // true, "0E1" is 0 * (10 ^ 1), or 0
var_dump("2E1" == "020"); // true, "2E1" is 2 * (10 ^ 1), or 20
?>Strings used in numeric contexts
When a string needs to be evaluated as a number (e.g. arithmetic operations, int type declaration, etc.) the following steps are taken to determine the outcome:
- If the
stringis numeric, resolve to anintif thestringis an integer numeric string and fits into the limits of theinttype limits (as defined byPHP_INT_MAX), otherwise resolve to afloat. - If the context allows leading numeric strings and the
stringis one, resolve to anintif the leading part of thestringis an integer numeric string and fits into the limits of theinttype limits (as defined byPHP_INT_MAX), otherwise resolve to afloat. Additionally an error of levelE_WARNINGis raised. - If the
stringis not numeric, throw aTypeError.
Behavior prior to PHP 8.0.0
Prior to PHP 8.0.0, a string was considered numeric if it only had leading whitespaces. If it had trailing whitespaces then the string was considered to be leading numeric.
Prior to PHP 8.0.0, when a string was used in a numeric context it would perform the same steps as above with the following differences:
- The usage of a leading numeric string would raise an
E_NOTICEinstead of anE_WARNING. - If the string was not numeric, an
E_WARNINGwas raised and the value0would be returned.
Prior to PHP 7.1.0, neither E_NOTICE nor E_WARNING was raised.
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "bob3"; // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "10 Small Pigs"; // $foo is integer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1; // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1.0; // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
?>