Search code examples
phpintlnumberformatter

NumberFormatter currency symbol(prepend)



I'm using the Intl libary to format numbers with currency symbol.

$number = new NumberFormatter('es_ES', NumberFormatter::CURRENCY);
echo $number->format('234234.234324');

My local php version:

version 1.1.0
ICU version 50.1.2
ICU Data version    50.1

Server:

version 1.1.0
ICU version 50.1.2

Results:
My version:234.234,23 €
Server version:€ 234.234,23

The currency symbol should be at the end of the number instead of being at the beginning of the number

Thanks


Solution

  • I made it as a helper.

    /**
     * Number format wrapper
     */
    class NumberFormat extends Helper\NumberFormat {
        private $serviceLocator;
    
        public function setServiceLocator($service) {
            $this->serviceLocator = $service;
        }
        /**
         * Number format
         * @param type $number
         * @param type $decimals
         * @param type $formatStyle
         * @param string $currency
         * @param type $locale
         * @return string
         */
        public function __invoke(
            $number,
            $decimals    = null,
            $formatStyle = null,
            $currency  = null,
            $locale      = null
        ) {
    
            $currency = strtoupper($currency);
            //get current locale
            $currentLocale = $this->serviceLocator->get('translator')->getLocale();
            $config  =  $this->serviceLocator->get('config');
    
            //mapping between countries
            if(isset($config['application-options']['currency-symbol-map'][$currentLocale])) {
                $currenciesMapping = $config['application-options']['currency-symbol-map'];
                $localeCurrency = $currenciesMapping[$currentLocale];
                //England pound != euro
                if(strtolower($currency) != $localeCurrency) {
                    $locale = array_search($currency,$currenciesMapping);
                }
            };
    
            if (!$locale) {
                $locale = $currentLocale;
            }
            if (null === $formatStyle) {
                $formatStyle = $this->getFormatStyle();
            }
    
            if (!is_int($decimals) || $decimals < 0) {
                $decimals = $this->getDecimals();
            }
            // 6.000000 should be 6.00 and decimals more than 2
            $numberExplode = explode('.',$number);
    
            if($decimals > 2 && $numberExplode[1] == 0) {
                $decimals = 2;
            }
    
            $formatType = $this->getFormatType();
    
            $formatterId = md5($formatStyle . "\0" . $locale . "\0" . $decimals);
    
            if (!isset($this->formatters[$formatterId])) {
                $this->formatters[$formatterId] = new NumberFormatter(
                    $locale,
                    $formatStyle
                );
    
                if ($decimals !== null) {
                    $this->formatters[$formatterId]->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimals);
                    $this->formatters[$formatterId]->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimals);
                }
            }
    
            //modify pattern
            //always at the begining
            if($formatStyle == \NumberFormatter::CURRENCY) {
                $pattern = str_replace('¤','',$this->formatters[$formatterId]->getPattern());
                $this->formatters[$formatterId]->setPattern('¤'.$pattern);
            }
            if($currency == null)
                return  $this->formatters[$formatterId]->format($number, $formatType);
            else
                return $this->formatters[$formatterId]->formatCurrency($number,$currency);
        }
    }