<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.currency.exchange">
    <title>Echanger (convertir) des monnaies</title>

    <para>
        Dans la section précédente, nous avons parlé des calculs sur les monnaies. Mais comme vous pouvez imaginer,
        calculer des monnaies peut vite mener à des calculs internationnaux (entre pays différents).
    </para>

    <para>
        Dans un tel cas, les monnaies doivent être converties avec un taux. Les taux officiels sont conservés
        par les banques ou encore les journaux. Dans le Web, des services de conversion existent.
        <classname>Zend_Currency</classname> permet leur utilisation par fonction de rappel.
    </para>

    <para>
        D'abord, écrivons un service de change simple.
    </para>

    <programlisting language="php"><![CDATA[
class SimpleExchange implements Zend_Currency_CurrencyInterface
{
    public function getRate($from, $to)
    {
        if ($from !== "USD") {
            throw new Exception('On ne change que des USD');
        }

        switch ($to) {
            case 'EUR':
                return 2;
            case 'JPE':
                return 0.7;
       }

       throw new Exception('Impossible de changer vers $to');
    }
}
]]></programlisting>

    <para>
        Nous venons de créer un service de change manuellement.
    </para>

    <para>
        Votre classe de service de change doit implémenter
        <classname>Zend_Currency_CurrencyInterface</classname>. Cette interface
        définit une seule méthode <methodname>getRate()</methodname>, qui prend deux paramètres :
        les noms courts des monnaies. <classname>Zend_Currency</classname> a besoin que le taux de change
        soit retourné.
    </para>

    <para>
        Dans un service réel, vous demanderiez au fournisseur les taux de change, dans notre exemple nous les
        codons en dur.
    </para>

    <para>
        Attachons maintenant notre classe avec <classname>Zend_Currency</classname>. Ceci se fait de deux manières
        , soit en attachant l'objet ou en attachant le nom de sa classe.
    </para>

    <programlisting language="php"><![CDATA[
$currency = new Zend_Currency(
    array(
        'value'    => 1000,
        'currency' => 'EUR',
    )
);

$service  = new SimpleExchange();

// attachons le service de change
$currency->setService($service);

$currency2 = new Zend_Currency(
    array(
        'value'    => 1000,
        'currency' => 'USD',
    )
);

print $currency->add($currency2);
]]></programlisting>

    <para>
        L'exemple ci-dessus retournera '$ 3.000' car 1.000 <acronym>USD</acronym> seront convertis avec
        un taux de 2 vers 2.000 <acronym>EUR</acronym>.
    </para>

    <note>
        <title>Calcul sans service de change</title>

        <para>
            Si vous tentez des calculs avec deux monnaies de types différents et qu'aucun service de change
            n'a été précisé, une exception sera levée.<classname>Zend_Currency</classname> ne sait pas
            nativement passer d'une monnaie à une autre.
        </para>
    </note>
</sect1>
