0

It is very possible that I totally don't understand the Zend aproach in working with currencies.

What I want to do is to have a Zend_Currency object where the active currency is EURO and the language to be English (the locale of the application is en_GB). Zend_Currency is connected to a locale and if a create a Zend_Currency with an English locale I cannot have EUR.

I've also tried this

$this->currency = new Zend_Currency(array('currency' => 'EUR'), "en_GB");

But if I try to

echo $this->currency->getSymbol(); // I get £

And there are no methods for changing the currency.

Elzo Valugi
  • 27,240
  • 15
  • 95
  • 114

3 Answers3

3

This worked:

$this->currency = new Zend_Currency('en_GB');
$this->currency->setFormat(array('currency' =>  'EUR', 'name' =>'EUR', 'symbol' => '€'));
Elzo Valugi
  • 27,240
  • 15
  • 95
  • 114
2

I have extended Zend_Currency and overwritten the getName() and getSymbol() methods so that they (as does Zend_Currency when the locale changed, which we don't want..) return 'fresh' data from Zend_Locale_Data each time I do a request.

In the example class below you can create an instance of Default_Model_Currency() and set the 'currency' option to any valid currency (eg. EUR, USD etc) while keeping the same locale.

<?php

/*
* Currency class extends Zend_Currency with exchange
* functionality using the Exchange_Service
*
* @author HF Bonnet
*/
class Default_Model_Currency extends Zend_Currency
{
    /*
    * Precision to round currency values with, the
    * default precision is 0
    */
    private $_precision = 0;




    /*
    * Set the currency's precision
    *
    * @attribute int $precision
    * @return Default_Model_Currency
    */
    public function setPrecision($precision)
    {
        $validator = new Zend_Validator_Digits();
        if ($validator->isValid($precision))
            $this->_precision = $precision;

        return $this;
    }



    /*
    * Becouse of problems with zend_currency I've choosen
    * to override __toString
    */
    public function __toString()
    {
        return sprintf(
            '%s %s',
            $this->getShortName(),
            $this->getValue()
        );
    }



    /*
    * Get the full name from a currency, this method is overwitten
    * to support the changing of currency without changing the locale
    *
    * @param string $currency (Optional) Currency name
    * @param string|Zend_Locale $locale
    * @return string $name
    */
    public function getName($currency = null, $locale = null)
    {
        return Zend_Locale_Data::getContent(
            null, 
            'nametocurrency', 
            $this->getShortName()
        );
    }



    /*
    * Get the full name from a currency, this method is overwitten
    * to support the changing of a locale
    *       
    * @param string $currency (Optional) Currency name
    * @param string|Zend_Locale $locale
    * @return string $name
    */
    public function getSymbol($currency = null, $locale = null)
    {
        return Zend_Locale_Data::getContent(
            null, 
            'currencysymbol', 
            $this->getShortName()
        );
    }



    /*
    * Get the localized value from the currency
    *
    * @return string $value
    */
    public function getLocalizedValue()
    {
        return Zend_Locale_Format::toNumber(
            parent::getValue(),
            array(
                'precision' => $this->_precision,
                'locale' => $this->getLocale()
            )
        );
    }



    /*
    * Get the default valuta. First checks in the Zend_Registry
    * for the default valuta, if not found it is fetched from the
    * database.
    * 
    * @return string $defaultCurrency
    */
    public function getDefaultValuta()
    {
        $currency = Zend_Registry::get('currency');

        if (!isset($currency['default'])):
            $className = Zend_Registry::get('prefix')->services . 'Registry';
            $currency['default'] = $className::getInstance()
                                             ->getDb('currencyValuta')
                                             ->getDefaultValuta()
                                             ->getIso();
            Zend_Registry::set(
                'currency', $currency
            );
        endif;

        return $currency['default'];
    }



    /*
    * Exchanges the currency using the rates found in the
    * exchange service.
    *
    * @attribute string $to
    * @return Default_Model_Currency
    */
    public function exchange($to)
    {
        if ($to === $this->getShortName())
            return $this;

        $currencyTo = new Default_Model_Currency(
            array(
                'value' => 0,
                'currency' => $to,
                'precision' => $this->_precision
            )
        );

        // Set the exchange service
        $currencyTo->setService(
            $this->getExchangeService()
        );

        return $currencyTo->add($this);
    }



    /*
    * Get an Default_Model_Settings instance
    * 
    * @return Default_Model_Settings 
    */
    public function getExchangeService()
    {
        $className = Zend_Registry::get('prefix')->services . 'Exchange';
        return $className::getInstance();
    }

}
halfpastfour.am
  • 5,764
  • 3
  • 44
  • 61
-2

This seems to work :-

$currency = new Zend_Currency();
$currency->setFormat(array('currency' => 'EUR', 'symbol' => '€'));

You can pass getFormat() an array to set the options like this. http://framework.zend.com/manual/en/zend.currency.options.html

vascowhite
  • 18,120
  • 9
  • 61
  • 77
  • You asked about changing the currency and in particular about the result of getSymbol(), which I answered and led to you working out the final answer for yourself, so I'm slightly miffed that you accepted your own answer over mine. Glad you got there in the end though :) – vascowhite Jun 17 '11 at 20:11
  • your answer did not work. mine did. and you did not explain why – Elzo Valugi Jun 17 '11 at 20:22
  • My answer worked for what you asked in your original question. Never mind, it's no biggie. – vascowhite Jun 17 '11 at 20:38