<!-- EN-Revision: 12150 -->
<sect1 id="zend.measure.creation">
    <title>Création d'une mesure</title>

    <para>En créant un objet de mesure, les méthodes <classname>Zend_Measure_*</classname> prévoient que l'entrée ou la mesure
    originale soit le premier paramètre. Ceci peut être un <link linkend="zend.measure.creation.number"><code>argument
    numérique</code></link>, une <link linkend="zend.measure.creation.string"><code>chaîne</code></link> sans unités, ou
    une <link linkend="zend.measure.creation.localized"><code>chaîne régionale</code></link> avec une (des) unité(s)
    spécifiée(s). Le deuxième paramètre définit le type de la mesure. Les deux paramètres sont obligatoires. La langue
    peut être indiquée comme troisième paramètre optionnel.</para>

    <sect2 id="zend.measure.creation.number">
        <title>Créer des mesures à partir de nombres entiers et décimaux</title>

        <para>En plus des valeurs de données en nombre entier, des nombre décimaux peuvent être employés, mais <ulink
        url="http://www.php.net/float">"il est fréquent que de simples fractions décimales telles que 0.1 ou 0.7 ne
        puissent être converties au format interne binaire sans une légère perte de précision"</ulink> parfois en
        donnant des résultats étonnants. En outre, il ne faut pas comparer l'égalité de deux nombres décimaux.</para>

        <example id="zend.measure.creation.number.example-1">
            <title>Création de mesure en utilisant des nombres entiers et décimaux</title>

            <programlisting role="php"><![CDATA[
$mesure = 1234.7;
$unite = new Zend_Measure_Length((integer)$mesure,
                                  Zend_Measure_Length::STANDARD);
echo $unite;
// affiche '1234 m' (mètres)

$unite = new Zend_Measure_Length($mesure, Zend_Measure_Length::STANDARD);
echo $unite;
// affiche '1234.7 m' (mètres)
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.measure.creation.string">
        <title>Créer des mesures à partir de chaînes de caractères</title>

        <para>Beaucoup de mesures reçues comme entrée des applications Zend Framework peuvent seulement être passées aux classes
        <classname>Zend_Measure_*</classname> comme des chaînes, telles que des nombres écrits en utilisant les <ulink
        url="http://fr.wikipedia.org/wiki/Num%C3%A9ration_romaine">chiffres romains</ulink> ou les valeurs binaires
        extrêmement grandes qui excèdent la précision native de PHP des nombres entiers ou décimaux. Puisque les nombres
        entiers peuvent être indiqués en utilisant des chaînes, s'il y a un quelconque risque de perdre la précision à
        cause des limitations des types natifs (nombre entier et décimaux), il faut utiliser des chaînes à la place.
        <classname>Zend_Measure_Number</classname> emploie l'extension BCMath pour supporter la précision arbitraire, afin
        d'éviter les limitations dans beaucoup de fonctions de PHP, telle que <ulink
        url="http://php.net/bin2dec"><code>bin2dec()</code></ulink>.</para>

        <example id="zend.measure.creation.string.example-1">
            <title>Création de mesure en utilisant des chaînes</title>

            <programlisting role="php"><![CDATA[
$machaine = "10010100111010111010100001011011101010001";
$unit = new Zend_Measure_Number($machaine, Zend_Measure_Number::BINARY);

echo $unit;
]]></programlisting>
        </example>

        <para>Habituellement, <classname>Zend_Measure_*</classname> peut automatiquement extraire la mesure désirée incluse dans
        une chaîne arbitraire. Seulement le premier nombre identifiable, indiqué en utilisant les chiffres
        européens/latins standard (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), sera employé pour la création de la mesure. S'il y a
        des chiffres plus loin dans la chaîne, ceux-ci seront ignorés.</para>

        <example id="zend.measure.creation.string.example-2">
            <title>Saisie de texte arbitraire contenant des mesures</title>

            <programlisting role="php"><![CDATA[
$machaine = "Ma maison a une superficie de 125m².";
$unite = new Zend_Measure_Area($machaine, Zend_Measure_Area::STANDARD);
echo $unite; // affiche "125 m²";

$machaine = "Ma maison a une superficie de 125m²,"
          . " elle comprend 5 pièces de 25m² chacune.";
$unite = new Zend_Measure_Area($machaine, Zend_Measure_Area::STANDARD);
echo $unite; // affiche "125 m² in size";
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.measure.creation.localized">
        <title>Mesures à partir de chaînes localisées</title>

        <para>Quand une corde est présentée dans une notation régionalisée, l'interprétation correcte ne peut pas être
        déterminée sans connaître la région attendue. La division des chiffres décimaux avec "." et grouper des milliers
        avec "," est commun en l'anglais, mais pas dans d'autres langues. Par exemple, le nombre anglais "1,234.50"
        serait interprété comme "1.2345" en allemand. Pour traiter de tels problèmes, la famille des classes
        <classname>Zend_Measure_*</classname> offrent la possibilité d'indiquer une langue ou une région pour lever l'ambiguïté
        les données d'entrée et pour interpréter correctement la valeur sémantique prévue.</para>

        <example id="zend.measure.creation.localized.example-1">
            <title>Chaînes localisées</title>

            <programlisting role="php"><![CDATA[
$locale = new Zend_Locale('de');
$machaine = "The boat is 1,234.50 long.";
$unite = new Zend_Measure_Length($machaine,
                                 Zend_Measure_Length::STANDARD, $locale);
echo $unite; // affiche "1.234 m"


$machaine = "The boat is 1,234.50 long.";
$unite = new Zend_Measure_Length($machaine,
                                 Zend_Measure_Length::STANDARD, 'en_US');
echo $unite; // affiche "1234.50 m"
]]></programlisting>
        </example>

        <para>Depuis la version 1.7.0 de Zend Framework, <classname>Zend_Measure</classname> supporte aussi l'utilisation d'une
        application pleinement localisée. Vous pouvez simplement paramétrer une instance <classname>Zend_Locale</classname> dans
        le registre comme présenté ci-dessous. Avec cette notation vous pouvez ne pas paramétrer cette valeur
        manuellement à chaque fois quand vous utilisez la même localisation plusieurs fois.</para>

        <programlisting role="php"><![CDATA[
// in your bootstrap file
$locale = new Zend_Locale('de_AT');
Zend_Registry::set('Zend_Locale', $locale);

// somewhere in your application
$length = new Zend_Measure_Length(Zend_Measure_Length::METER();
]]></programlisting>
    </sect2>
</sect1>