2016-05-16 1 views
-1

J'utilise dans une extension twig le composant intl pour obtenir le symbole de la devise.Sf2: composant Intl, formatCurrency

Assez simple car elle est bien expliquée here.

Mais ce que je voudrais faire est de formater le prix en fonction de la devise/locale.

Il y a en effet une formatCurrency méthode dans le composant intl (NumberFormatter class)

<?php 
namespace SE\AppBundle\Twig; 

use Doctrine\ORM\EntityManager; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Intl\Intl; 

class PriceExtension extends \Twig_Extension 
{ 

    private $em; 
    private $requestStack; 

    public function __construct(EntityManager $em, RequestStack $requestStack) 
    { 
     $this->em = $em; 
     $this->requestStack = $requestStack; 
    } 

    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('price', array($this, 'priceFilter')), 
     ); 
    } 

    public function priceFilter($price) 
    { 

     $request = $this->requestStack->getCurrentRequest(); 
     $currency_code = $request->cookies->get('currency'); 

     $exchange_rate = $this->em->getRepository('ApiBundle:ExchangeRates')->findOneBy(array('code' => $currency_code)); 

     $price = $price*$exchange_rate->getRate(); 

     // Get the currency symbol 
     // $symbol = Intl::getCurrencyBundle()->getCurrencySymbol($currency_code); 
     // $price = $symbol.$price; 

     // Undefined formatCurrency method 
     $price = Intl::getCurrencyBundle()->formatCurrency($price, $currency_code); 

     return $price; 

    } 

    public function getName() 
    { 
     return 'price_extension'; 
    } 
} 

Comment pourrais-je être en mesure d'utiliser la méthode de formatCurrency?

+0

Vérifiez à nouveau. Comme je l'ai mentionné, j'utilise le composant. Mais si je reçois le paquet de devises, c'est là que j'ai fait une erreur. Tout ce que j'ai besoin de savoir, c'est comment puis-je utiliser celui du composant alors. https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php – Brieuc

Répondre

1

La totalité Intl Component est juste couche de remplacement pour les cas où vous n'avez pas installé intl extension.

Donc, votre code devrait ressembler à:

<?php 
namespace SE\AppBundle\Twig; 

use Doctrine\ORM\EntityManager; 
use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Intl\NumberFormatter\NumberFormatter; 

class PriceExtension extends \Twig_Extension 
{ 

    private $em; 
    private $requestStack; 

    public function __construct(EntityManager $em, RequestStack $requestStack) 
    { 
     $this->em = $em; 
     $this->requestStack = $requestStack; 
    } 

    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('price', array($this, 'priceFilter')), 
     ); 
    } 

    public function priceFilter($price) 
    { 

     $request = $this->requestStack->getCurrentRequest(); 
     $currency_code = $request->cookies->get('currency'); 

     $exchange_rate = $this->em->getRepository('ApiBundle:ExchangeRates')->findOneBy([ 
      'code' => $currency_code 
     ]); 

     $price = $price*$exchange_rate->getRate(); 

     if(false === extension_loaded('intl')) { 
      $formatter = new NumberFormatter('en', NumberFormatter::CURRENCY); 
     } else { 
      $formatter = new \NumberFormatter(
       $request->getLocale(), 
       \NumberFormatter::CURRENCY 
      ); 
     } 

     return $formatter->formatCurrency($price, $currency_code); 
    } 

    public function getName() 
    { 
     return 'price_extension'; 
    } 
} 
+0

Merci, je l'ai maintenant :). – Brieuc