PHP.nl

Numeric strings

Numeric strings

A PHP is considered numeric if it can be interpreted as an or a . string``int``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 numeric strings. This is simply a string which starts like a numeric string followed by any characters. leading

Opmerking: > Any string that contains the letter (case insensitive) bounded by numbers will be seen as a number expressed in scientific notation. This can produce unexpected results. E

Voorbeeld: 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 needs to be evaluated as number (e.g. arithmetic operations, type declaration, etc.) the following steps are taken to determine the outcome:

string``int1. If the is numeric, resolve to an if the is an integer numeric string and fits into the limits of the type limits (as defined by ), otherwise resolve to a . string``int``string``int``PHP_INT_MAX``float 2. If the context allows leading numeric strings and the is one, resolve to an if the leading part of the is an integer numeric string and fits into the limits of the type limits (as defined by ), otherwise resolve to a . Additionally an error of level is raised. string``int``string``int``PHP_INT_MAX``float``E_WARNING 3. The is not numeric, throw a . string``TypeError

Behavior prior to PHP 8.0.0

Prior to PHP 8.0.0, a was considered numeric only if it had whitespaces, if it had whitespaces then the string was considered to be leading numeric. stringleading**trailing

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:

Prior to PHP 7.1.0, neither nor was raised.

  • The usage of a leading numeric string would raise an instead of an . E_NOTICE``E_WARNING
  • If the string is not numeric, an was raised and the value would be returned. E_WARNING``0

E_NOTICE``E_WARNING

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