Navigation

Related Articles

Back to Latest Articles

Tips : Conversions de devises


Samuel Breton
Tips : Conversions de devises

Aujourd’hui je vous montre juste une petite astuce pour avoir les taux de conversion de l’Euro vers d’autres devises.

Le site de la banque centrale Européenne publie tous les jours un fichier XML contenant les taux de conversion à jour.

Il fournit également un morceau de code donnant un exemple de manipulation

http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

Voici le code fourni par le site lui-même pour les développeurs :

  <?php
//This is a PHP (4/5) script example on how eurofxref-daily.xml can be parsed 
 
//Read eurofxref-daily.xml file in memory 
$XMLContent= file("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
//the file is updated daily between 2.15 p.m. and 3.00 p.m. CET
 
foreach ($XMLContent as $line) {
        if (ereg("currency='([[:alpha:]]+)'",$line,$currencyCode)) {
            if (ereg("rate='([[:graph:]]+)'",$line,$rate)) {
                    //Output the value of 1 EUR for a currency code 
                    echo '1 &euro; = '.$rate[1].' '.$currencyCode[1].'<br />';
                    //--------------------------------------------------
                    // Here you can add your code for inserting
                    // $rate[1] and $currencyCode[1] into your database
                    //--------------------------------------------------
            }
        }
}
?>

Ce code permet d’afficher les taux de conversion Euro vers devise pour toutes les devises.
(source : http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html)

Et voici un helper tout simple permettant de convertir directement de EUR vers une devise, en utilisant la librairie Dom.

function convertEuroToCurrency($value, $currency)
{
//ouverture du doc
  $dom_rates = new DOMDocument();
  $dom_rates->load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
  //récupération de l'ensemble des éléments Cube
  $dom_cubes = $dom_rates->getElementsByTagName('Cube');
 
  $i = 0;
  $j = 0;
  $rate_found=false;
  //tant qu'on a pas trouvé le bon pays, on continue
  while (!$rate_found && $cube = $dom_cubes->item($i))
  {
    $j = 0;
    //tant qu'on a pas trouvé le bon pays, on continue
    while(!$rate_found && $attribute = $cube->attributes->item($j))
    {
    //si on est en train de lire le noeud "temps" on stocke la date
      if($attribute->name == 'time') $date = $attribute->value;
 
      //si l'attribut et "currency" on est en train de lire le code pays, on vérifie aussi que c'est le bon
      $rate_found = $attribute->name == 'currency' && $attribute->value == $currency;
      $j++;
    }
    $i++;
  }
 
  //si le pays a été trouvé, on affiche le résultat de la conversion
  if($rate_found)
  {
    return "le ".$date." ".$value." EUR = ".($cube->attributes->item($j)->value*$value).' '.$cube->attributes->item($j-1)->value;
  }else{
    return "cette devise n'existe pas";
  }
}

Pour tester :

use_helper('Converter');
echo convertEurToCurrency(125, 'USD');

Et voilà !

Show Comments (7)

Comments

  • Alexandre

    Mais avec ça, tu ne vas pas charger ton XML à chaque fois que tu veux convertir une valeur ?

    • Article Author
  • Validation d’un numéro siret : sfValidatorSiret Blog Symfony – Lexik Montpellier

    […] vous avez pu le voir avec les récents posts, nous avons eu pas mal de gestion de facturation: conversion de devises, validation d’un numéro de tva […]

    • Article Author
  • jaycreation

    Enorme ! merci ! je met vite ton site en favoris !

    • Article Author
  • Clément Gautier

    Sympa effectivement. Par contre ça doit être sacrément mémorivore si t’y fait appel souvent. Sans compter les (peut etre rares je ne dis pas) moment où le flux n’est pas accessible.

    Pour ma part je vais récupérer une partie de ton script pour le mettre dans un cron qui tournera une fois par jour pour me mettre à jour en base les valeurs d’une table devise (accessoirement ça me permettra si j’ai envie de logger les cours des devises ^^).

    Merci à toi en tout cas pour ce helper ça dépanne bien 😉

    • Article Author
  • Yerkey

    Enfin un bon article sur ce sujet,je suis un geek blogger et j’ai parfois du mal a trouver ce genre de billets qui changent !

    • Article Author
  • Carles

    Bonjour,
    ereg() est obsolete, il y a un article qui explique une façon simple d’extraire les données de cet xml:
    http://sldesign.openwab.com/2010/06/26/sugar-crm-gestion-des-devises-en-automatique/

    Cube->Cube->Cube;
    $currency[] = array();
    foreach($devises as $devise => $att)
    {
    $att[‘currency’]; // ex: USD
    $att[‘rate’]; // ex: 1.3222
    }
    ?>

    en vous remerciant pour ce forum si interessant 😉

    • Article Author
  • Samuel Breton

    C’est quand meme bien fait!

    • Article Author

Recevez nos articles