1
0
mirror of https://github.com/php/doc-fr.git synced 2026-03-23 22:52:18 +01:00
Files
archived-doc-fr/language/types/numeric-strings.xml
2026-02-20 09:45:20 +01:00

159 lines
6.0 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: pierrick Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Chaînes numériques</title>
<para>
Une chaîne de caractères PHP <type>string</type> est considérée comme numérique si elle peut être interprétée comme
un <type>int</type> ou un <type>float</type>.
</para>
<para>
Formellement à partir de PHP 8.0.0 :
</para>
<informalexample>
<programlisting>
<![CDATA[
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})
]]>
</programlisting>
</informalexample>
<para>
PHP dispose également d'un concept de chaînes <emphasis>débutant</emphasis> numériquement.
Il s'agit simplement d'une chaîne qui commence comme une chaîne numérique suivie de
n'importe quel caractère.
</para>
<note>
<para>
Toute chaîne contenant la lettre <literal>E</literal> (insensible à la casse)
délimitée par des nombres sera considérée comme un nombre exprimé en notation scientifique.
Cela peut produire des résultats inattendus.
</para>
<example>
<title>Comparaisons avec notation scientifique</title>
<programlisting role="php">
<![CDATA[
<?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
?>
]]>
</programlisting>
</example>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
<title>Chaînes de caractères utilisées dans des contextes numériques</title>
<para>
Lorsqu'une <type>string</type> doit être évaluée comme un nombre (par exemple, opérations
arithmétiques, déclaration de type <type>int</type>, etc.),
les étapes suivantes sont suivies pour déterminer le résultat :
<orderedlist>
<listitem>
<simpara>
Si la <type>string</type> est numérique, elle est résolue en <type>int</type> si
la <type>string</type> est une chaîne numérique entière et entre dans les
limites du type <type>int</type> (telles que définies par
<constant>PHP_INT_MAX</constant>), sinon elle est résolue en un
<type>float</type>.
</simpara>
</listitem>
<listitem>
<simpara>
Si le contexte autorise les chaînes débutant numériquement et que la <type>string</type>
en est une, elle est résolue en <type>int</type> si la partie initiale de la chaîne
<type>string</type> est une chaîne numérique entière et entre dans les
limites du type <type>int</type> (telles que définies par
<constant>PHP_INT_MAX</constant>), sinon elle est résolue en un
<type>float</type>.
De plus, une erreur de niveau <constant>E_WARNING</constant> est soulevée.
</simpara>
</listitem>
<listitem>
<simpara>
Si la <type>string</type> n'est pas numérique, une <classname>TypeError</classname>
est lancée.
</simpara>
</listitem>
</orderedlist>
</para>
</sect2>
<sect2 xml:id="language.types.numeric-string.prior">
<title>Comportement antérieur à PHP 8.0.0</title>
<para>
Avant PHP 8.0.0, une <type>string</type> était considérée comme numérique seulement si elle
avait des espaces blancs en <emphasis>début</emphasis> de chaîne, si elle avait des espaces blancs
en <emphasis>fin</emphasis> de chaîne, la chaîne était considérée comme une chaîne débutant numériquement.
</para>
<para>
Avant PHP 8.0.0, lorsqu'une chaîne de caractères était utilisée dans un contexte numérique,
elle effectuait les mêmes étapes que ci-dessus, avec les différences suivantes :
<itemizedlist>
<listitem>
<simpara>
L'utilisation d'une chaîne de caractères débutant numériquement générait une erreur de type
<constant>E_NOTICE</constant> au lieu de <constant>E_WARNING</constant>.
</simpara>
</listitem>
<listitem>
<simpara>
Si la chaîne de caractères n'était pas numérique, une <constant>E_WARNING</constant>
était levée et la valeur <literal>0</literal> était retournée.
</simpara>
</listitem>
</itemizedlist>
Avant PHP 7.1.0, ni <constant>E_NOTICE</constant>
ni <constant>E_WARNING</constant> n'étaient levées.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?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
?>
]]>
</programlisting>
</informalexample>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->