PHP: Hypertext Preprocessor (original) (raw)

Numeric strings

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.

Note:

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.

Example #1 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 number (e.g. arithmetic operations, int type declaration, etc.) the following steps are taken to determine the outcome:

  1. If the string is numeric, resolve to an int if the string is an integer numeric string and fits into the limits of the int type limits (as defined by**[PHP_INT_MAX](reserved.constants.php#constant.php-int-max)**), otherwise resolve to afloat.
  2. If the context allows leading numeric strings and the string is one, resolve to an int if the leading part of thestring is an integer numeric string and fits into the limits of the int type limits (as defined by**[PHP_INT_MAX](reserved.constants.php#constant.php-int-max)**), otherwise resolve to afloat. Additionally an error of level [E_WARNING](errorfunc.constants.php#constant.e-warning) is raised.
  3. The string is not numeric, throw aTypeError.

Behavior prior to PHP 8.0.0

Prior to PHP 8.0.0, a string was considered numeric only if it 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:

Prior to PHP 7.1.0, neither [E_NOTICE](errorfunc.constants.php#constant.e-notice) nor [E_WARNING](errorfunc.constants.php#constant.e-warning) was raised.

<?php <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mn>10.5</mn><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = 1 + &quot;10.5&quot;; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">&quot;10.5&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is float (11.5) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mo>−</mo><mn>1.3</mn><mi>e</mi><mn>3</mn><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = 1 + &quot;-1.3e3&quot;; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">&quot;</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.3</span><span class="mord mathnormal">e</span><span class="mord">3&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is float (-1299) <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mi>b</mi><mi>o</mi><mi>b</mi><mo>−</mo><mn>1.3</mn><mi>e</mi><mn>3</mn><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi><mi>T</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi><mi>a</mi><mi>s</mi><mi>o</mi><mi>f</mi><mi>P</mi><mi>H</mi><mi>P</mi><mn>8.0.0</mn><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">foo = 1 + &quot;bob-1.3e3&quot;; // TypeError as of PHP 8.0.0, </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">&quot;</span><span class="mord mathnormal">b</span><span class="mord mathnormal">o</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.3</span><span class="mord mathnormal">e</span><span class="mord">3&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord mathnormal">p</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal" style="margin-right:0.02778em;">rror</span><span class="mord mathnormal">a</span><span class="mord mathnormal">so</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">8.0.0</span><span class="mpunct">,</span></span></span></span>foo is integer (1) previously <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mi>b</mi><mi>o</mi><mi>b</mi><mn>3</mn><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi><mi>T</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>E</mi><mi>r</mi><mi>r</mi><mi>o</mi><mi>r</mi><mi>a</mi><mi>s</mi><mi>o</mi><mi>f</mi><mi>P</mi><mi>H</mi><mi>P</mi><mn>8.0.0</mn><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">foo = 1 + &quot;bob3&quot;; // TypeError as of PHP 8.0.0, </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">&quot;</span><span class="mord mathnormal">b</span><span class="mord mathnormal">o</span><span class="mord mathnormal">b</span><span class="mord">3&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord mathnormal">p</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord mathnormal" style="margin-right:0.02778em;">rror</span><span class="mord mathnormal">a</span><span class="mord mathnormal">so</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">8.0.0</span><span class="mpunct">,</span></span></span></span>foo is integer (1) previously <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>1</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mn>10</mn><mi>S</mi><mi>m</mi><mi>a</mi><mi>l</mi><mi>l</mi><mi>P</mi><mi>i</mi><mi>g</mi><mi>s</mi><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = 1 + &quot;10 Small Pigs&quot;; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">&quot;10</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">ma</span><span class="mord mathnormal" style="margin-right:0.13889em;">llP</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord">&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is integer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mn>4</mn><mo>+</mo><mi mathvariant="normal">&quot;</mi><mn>10.2</mn><mi>L</mi><mi>i</mi><mi>t</mi><mi>t</mi><mi>l</mi><mi>e</mi><mi>P</mi><mi>i</mi><mi>g</mi><mi>g</mi><mi>i</mi><mi>e</mi><mi>s</mi><mi mathvariant="normal">&quot;</mi><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = 4 + &quot;10.2 Little Piggies&quot;; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">&quot;10.2</span><span class="mord mathnormal">L</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">ttl</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">gg</span><span class="mord mathnormal">i</span><span class="mord mathnormal">es</span><span class="mord">&quot;</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is float (14.2) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mi mathvariant="normal">&quot;</mi><mn>10.0</mn><mi>p</mi><mi>i</mi><mi>g</mi><mi>s</mi><mi mathvariant="normal">&quot;</mi><mo>+</mo><mn>1</mn><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = &quot;10.0 pigs &quot; + 1; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">&quot;10.0</span><span class="mord mathnormal">p</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord">&quot;</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>o</mi><mi>o</mi><mo>=</mo><mi mathvariant="normal">&quot;</mi><mn>10.0</mn><mi>p</mi><mi>i</mi><mi>g</mi><mi>s</mi><mi mathvariant="normal">&quot;</mi><mo>+</mo><mn>1.0</mn><mo separator="true">;</mo><mi mathvariant="normal">/</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">foo = &quot;10.0 pigs &quot; + 1.0; // </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">oo</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">&quot;10.0</span><span class="mord mathnormal">p</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord">&quot;</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.0</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">//</span></span></span></span>foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously ?>

Found A Problem?

stromov1010 at mail dot ru

4 months ago

`you should to add example without whitespaces:

$foo = 4 + "10.2LittlePiggies";

`