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
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);
}
}