Thursday, December 31, 2009

Working with currencies

In this example, we display currencies in various formats and various languages.

Components used in this example
Working with currencies

class MyCurrency
Processing the currency
  • We get the locale, the region, the currency, the format and the output method.
  • We set the cache.
  • We verify the locale or we search the locale.
  • We store the locale in the registry.
  • We extract the territory from the locale if requested.
  • We extract the currency from the territory if requested.
  • We define the format of the currency if any.
  • We execute the action.
  • If we catch an exception, we return the error message.

    public function process()
// We get the locale, the region, the currency, the format and the output method.
$action) = $this->_getParameters();

        try {
// We set the cache.

// We verify the locale or we search the locale.
$locale MyLocale::findLocale($locale);
// We store the locale in the registry.
Zend_Registry::set('Zend_Locale', new Zend_Locale($locale));

// We extract the territory from the locale if requested.
$fromLocale and list(, $region) = explode('_'$locale);
// We extract the currency from the territory if requested.
$fromRegion and $currency MyLocale::getRegionCurrency($region);
$zendCurrency = new Zend_Currency($currency);

// We define the format of the currency if any.
$display and $format['display'] = constant("Zend_Currency::$display");
$position and $format['position'] = constant("Zend_Currency::$position");
is_null($precision) or $format['precision'] = (int)$precision;
$format) or $zendCurrency->setFormat($format);

// We execute the action.
switch($action) {
$result $zendCurrency;

$result $zendCurrency->getCurrencyList($region);

$result $zendCurrency->$action();

$localized$normalized) =
$result $zendCurrency->toCurrency($normalized);

        } catch (
Exception $e) {
// If we catch an exception, we return the error message.
$result $e->getMessage();

        return array(
Extraction of the parameters from the GET request

    private function _getParameters()
$locale = empty($_GET['locale'])? null $_GET['locale'];
$region = empty($_GET['region'])? null $_GET['region'];
$fromLocale = empty($_GET)? : !empty($_GET['from-locale']);

$currency = empty($_GET['currency'])? null $_GET['currency'];
$fromRegion = empty($_GET)? : !empty($_GET['from-region']);

$localized = isset($_GET['localized'])? $_GET['localized'] : null;
$normalized = empty($_GET)? 1234.56 :
$_GET['normalized'])? $_GET['normalized'] : null);

$display = isset($_GET['display'])? $_GET['display'] : null;
$position = isset($_GET['position'])? $_GET['position'] : null;
$precision = isset($_GET['precision'])? $_GET['precision'] : null;
$precision == '' and $precision null;

$action = isset($_GET['action'])? $_GET['action'] : null;

        return array(
Setting the cache

    private function _setCache()
$frontendOptions = array('lifetime' => 3600'automatic_serialization' => true);
$backendOptions = array('cache_dir' => sys_get_temp_dir());
$cache Zend_Cache::factory('Core''File'$frontendOptions$backendOptions);
Setting the amount
  • We add the locale and the precision to the format.
  • We normalize the amount and we convert the amount according to the locale.

    private function _setNumber($localized$normalized$precision)
// We add the locale and the precision to the format.
$options['locale'] = Zend_Registry::get('Zend_Locale');
is_null($precision) or $options['precision'] = (int)$precision;

// We normalize the amount and we convert the amount according to the locale.
if ($normalized) {
$localized Zend_Locale_Format::toNumber($normalized$options);
$normalized Zend_Locale_Format::getNumber($localized$options);
        } else if (
$localized) {
$normalized Zend_Locale_Format::getNumber($localized$options);
$localized Zend_Locale_Format::toNumber($normalized$options);
        } else {
$localized Zend_Locale_Format::toNumber(0$options);
$normalized 0;

        return array(