Showing posts with label Zend_Locale_Format. Show all posts
Showing posts with label Zend_Locale_Format. Show all posts

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.
        
list($locale, $region, $fromLocale, $currency, $fromRegion,
            
$localized, $normalized, $display, $position, $precision,
            
$action) = $this->_getParameters();

        try {
            
// We set the cache.
            
$this->_setCache();

            
// 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;
            empty(
$format) or $zendCurrency->setFormat($format);

            
// We execute the action.
            
switch($action) {
                case 
'Zend_Currency':
                    
$result = $zendCurrency;
                    break;

                case 
'getCurrencyList':
                    
$result = $zendCurrency->getCurrencyList($region);
                    break;

                case 
'getName':
                case 
'getRegionList':
                case 
'getShortName':
                case 
'getSymbol':
                case 
'getLocale':
                case 
'toString':
                    
$result = $zendCurrency->$action();
                    break;

                case 
'toCurrency':
                default:
                    list(
$localized, $normalized) =
                        
$this->_setNumber($localized, $normalized, $precision);
                    
$result = $zendCurrency->toCurrency($normalized);
            }

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

        return array(
$locale, $region, $fromLocale, $currency, $fromRegion,
            
$localized, $normalized, $display, $position, $precision,
            
$action, $result);
    }
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)? 1 : !empty($_GET['from-locale']);

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

        
$localized = isset($_GET['localized'])? $_GET['localized'] : null;
        
$normalized = empty($_GET)? 1234.56 :
            (isset(
$_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(
$locale, $region, $fromLocale, $currency, $fromRegion,
            
$localized, $normalized, $display, $position, $precision,
            
$action);
    }
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);
        
Zend_Locale::setCache($cache);
    }
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(
$localized, $normalized);
    }

}