Files
archived-doc-pt-br/language/types/numeric-strings.xml
Leonardo Lara Rodrigues b1992407db sync with en rev
2025-04-10 11:21:28 -03:00

160 lines
5.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: leonardolara Status: ready --><!-- CREDITS: marcosmarcolin, leonardolara -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Strings numéricas</title>
<para>
Uma <type>string</type> PHP é considerada numérica se puder ser interpretada
como <type>int</type> ou <type>float</type>.
</para>
<para>
Formalmente a partir do 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>
O PHP também tem um conceito de strings numéricas <emphasis>principais</emphasis>.
Isso é simplesmente uma string que começa como uma string numérica seguida por
qualquer caractere.
</para>
<note>
<para>
Qualquer string que contenha a letra <literal>E</literal> (sem distinção entre maiúsculas e minúsculas)
delimitada por números será vista como um número expresso em notação científica.
Isso pode produzir resultados inesperados.
</para>
<example>
<title>Comparações de notações científicas</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // falso, "0D1" não é notação científica
var_dump("0E1" == "000"); // verdadeiro, "0E1" é 0 * (10 ^ 1), ou 0
var_dump("2E1" == "020"); // verdadeiro, "2E1" é 2 * (10 ^ 1), ou 20
?>
]]>
</programlisting>
</example>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
<title>Strings usadas em contextos numéricos</title>
<para>
Quando uma <type>string</type> precisa ser avaliada como número (por exemplo, operações
aritméticas, declaração de tipo <type>int</type>, etc.), as seguintes etapas
são executadas para determinar o resultado:
<orderedlist>
<listitem>
<simpara>
Se a <type>string</type> for numérica, resolva para um <type>int</type> se
a <type>string</type> for uma string numérica inteira e se encaixar nos
limites do tipo <type>int</type> (conforme definido por
<constant>PHP_INT_MAX</constant>), caso contrário resolva para um
<type>float</type>.
</simpara>
</listitem>
<listitem>
<simpara>
Se o contexto permitir strings numéricas iniciais e a <type>string</type>
for uma, resolva para um <type>int</type> se a parte inicial da string for uma
<type>string</type> numérica inteira e se encaixar nos
limites do tipo <type>int</type> (conforme definido por
<constant>PHP_INT_MAX</constant>), caso contrário resolva para um
<type>float</type>.
Além disso, um erro de nível <constant>E_WARNING</constant> é gerado.
</simpara>
</listitem>
<listitem>
<simpara>
A <type>string</type> não é numérica, lance um
<classname>TypeError</classname>.
</simpara>
</listitem>
</orderedlist>
</para>
</sect2>
<sect2 xml:id="language.types.numeric-string.prior">
<title>Comportamento antes do PHP 8.0.0</title>
<para>
Antes do PHP 8.0.0, uma <type>string</type> era considerada numérica apenas se
tivesse espaços em branco à <emphasis>esquerda</emphasis>, se tivesse espaços em branco à
<emphasis>direita</emphasis>, a string era considerada
numérica à esquerda.
</para>
<para>
Antes do PHP 8.0.0, quando uma string era usada em um contexto numérico,
ela executava as mesmas etapas acima com as seguintes diferenças:
<itemizedlist>
<listitem>
<simpara>
O uso de uma sequência numérica inicial geraria um
<constant>E_NOTICE</constant> em vez de um <constant>E_WARNING</constant>.
</simpara>
</listitem>
<listitem>
<simpara>
Se a string não for numérica, um <constant>E_WARNING</constant> foi
levantado e o valor <literal>0</literal> seria retornado.
</simpara>
</listitem>
</itemizedlist>
Antes do PHP 7.1.0, nem <constant>E_NOTICE</constant> nem
<constant>E_WARNING</constant> eram gerados.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 1 + "10.5"; // $foo é float (11.5)
$foo = 1 + "-1.3e3"; // $foo é float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError a partir do PHP 8.0.0, $foo é inteiro (1) anteriormente
$foo = 1 + "bob3"; // TypeError a partir do PHP 8.0.0, $foo é inteiro (1) anteriormente
$foo = 1 + "10 Small Pigs"; // $foo é inteiro (11) e um E_WARNING é levantado no PHP 8.0.0, E_NOTICE anteriormente
$foo = 4 + "10.2 Little Piggies"; // $foo é float (14.2) e um E_WARNING é levantado no PHP 8.0.0, E_NOTICE anteriormente
$foo = "10.0 pigs " + 1; // $foo é float (11) e um E_WARNING é levantado no PHP 8.0.0, E_NOTICE anteriormente
$foo = "10.0 pigs " + 1.0; // $foo é float (11) e um E_WARNING é levantado no PHP 8.0.0, E_NOTICE anteriormente
?>
]]>
</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
-->