public static function displayPrice($price, $currency = null, $no_utf8 = false, Context $context = null)
{
if (!is_numeric($price)) {
return $price;
}
if (!$context) {
$context = Context::getContext();
}
if ($currency === null) {
$currency = $context->currency;
} elseif (is_int($currency)) {
$currency = Currency::getCurrencyInstance((int)$currency);
}
if (is_array($currency)) {
$c_char = $currency['sign'];
$c_format = $currency['format'];
// change
$c_decimals = (int)$currency['decimals'];
$c_blank = $currency['blank'];
} elseif (is_object($currency)) {
$c_char = $currency->sign;
$c_format = $currency->format;
// change
$c_decimals = (int)$currency->decimals ;
$c_blank = $currency->blank;
} else {
return false;
}
// change
$c_decimalsrounded = (int)$c_decimals ;
// =currency decimals (=1)
$c_decimals = (int)$c_decimals * _PS_PRICE_DISPLAY_PRECISION_;
// display precison (= 1 * 2)
$blank = ($c_blank ? ' ' : '');
$ret = 0;
if (($is_negative = ($price < 0))) {
$price *= -1;
}
// changed
$price = Tools::ps_round($price, $c_decimalsrounded);
/*
* If the language is RTL and the selected currency format contains spaces as thousands separator
* then the number will be printed in reverse since the space is interpreted as separating words.
* To avoid this we replace the currency format containing a space with the one containing a comma (,) as thousand
* separator when the language is RTL.
*
* TODO: This is not ideal, a currency format should probably be tied to a language, not to a currency.
*/
if (($c_format == 2) && ($context->language->is_rtl == 1)) {
$c_format = 4;
}
switch ($c_format) {
/* X 0,000.00 */
case 1:
$ret = $c_char.$blank.number_format($price, $c_decimals, '.', ',');
break;
/* 0 000,00 X*/
case 2:
$ret = number_format($price, $c_decimals, ',', ' ').$blank.$c_char;
break;
/* X 0.000,00 */
case 3:
$ret = $c_char.$blank.number_format($price, $c_decimals, ',', '.');
break;
/* 0,000.00 X */
case 4:
$ret = number_format($price, $c_decimals, '.', ',').$blank.$c_char;
break;
/* X 0'000.00 Added for the switzerland currency */
case 5:
$ret = number_format($price, $c_decimals, '.', "'").$blank.$c_char;
break;
}
if ($is_negative) {
$ret = '-'.$ret;
}
if ($no_utf8) {
return str_replace('€', chr(128), $ret);
}
return $ret;
}
something like that
!!!!
and keep the PS_PRICE_DISPLAY_PRECISION at value = 2
to be true I would change also Cart.php (line 3052)
// from // $shipping_cost = (float)Tools::ps_round((float)$shipping_cost, (Currency::getCurrencyInstance((int)$this->id_currency)->decimals * _PS_PRICE_DISPLAY_PRECISION_)); // to $shipping_cost = (float)Tools::ps_round((float)$shipping_cost, (Currency::getCurrencyInstance((int)$this->id_currency)->decimals ));
and
OrderInvoice.php (line 560)
// from // $row['ecotax_tax_incl'] = Tools::ps_round($row['ecotax_tax_excl'] + ($row['ecotax_tax_excl'] * $row['rate'] / 100), _PS_PRICE_DISPLAY_PRECISION_); // $row['ecotax_tax_excl'] = Tools::ps_round($row['ecotax_tax_excl'], _PS_PRICE_DISPLAY_PRECISION_); // to $row['ecotax_tax_incl'] = Tools::ps_round($row['ecotax_tax_excl'] + ($row['ecotax_tax_excl'] * $row['rate'] / 100), Currency::getCurrencyInstance((int)$this->id_currency)->decimals ); $row['ecotax_tax_excl'] = Tools::ps_round($row['ecotax_tax_excl'], Currency::getCurrencyInstance((int)$this->id_currency)->decimals );