Jump to content
den4ikm

Убрать нули в цене (опять, но не совсем)

Recommended Posts

Приветствую, форумчане!

Прошу помощи в решении специфичной задачи: Нужно убрать в отображении цены на сайте цифр после запятой (и саму запятую) в случае если эти цыфры = .00

Дело в том, что в магазине есть несколько товаров ценой с копейками. Соответственно в настройках цены стоит: округлять до 2-х знаков после запятой. Но подавляющее число товаров с ценой в рублях (без копеек). И получается что цены вида рр.00, что не очень эстетично и в ряде мест не помещается из-за длинны.

Как я понимаю, настройки округления цены нельзя разделить между категориями и товарами?

Share this post


Link to post
Share on other sites

руками допиливтаь
round();

Share this post


Link to post
Share on other sites

Спасибо за ответ

а про напильник подробнее, хотя бы навскидку?

Share this post


Link to post
Share on other sites

Саму функцию чтобы убрать думаю такую использовать:

rtrim($text, ".00");

либо регулярку

а вот где это искать - вопрос

 

Share this post


Link to post
Share on other sites

ceil

ceil - округляет дроби в сторону увеличения.

Описание

float ceil (float value)

Возвращает следующее ближайшее целочисленное значение путём округления value, если это необходимо.
return-значение ceil() сохраняет тип float, так как диапазон значений float обычно больше, чем у integer.

Пример 1. ceil()
echo ceil(4.3);    // 5
echo ceil(9.999);  // 10

Share this post


Link to post
Share on other sites

Похоже вы не так поняли, округление не нужно:

Есть 2 вида цен:

123.45 ‘нужно оставить как есть’

123.00 ‘нужно избавить от нулей’

Share this post


Link to post
Share on other sites
28 минут назад, den4ikm сказал:

rtrim($text, ".00");

Это ппц

Читайте документацию

Share this post


Link to post
Share on other sites

 

Share this post


Link to post
Share on other sites

str_replace('.00',''

Share this post


Link to post
Share on other sites
55 минут назад, den4ikm сказал:

123.00 ‘нужно избавить от нулей’

Тогда $cost = preg_replace('/(\.){1}(\d)++/i','',$cost);

Это уберет все после точки, в отличие от str_replace('.00',''

Share this post


Link to post
Share on other sites
6 минут назад, esculapra сказал:

$cost = preg_replace('/(\.){1}(\d)++/i','',$cost);

Но вначале нужно прописать условие if(preg_match('/(\.){1}(0){3}/i',$cost)) {

$cost = preg_replace('/(\.){1}(\d)++/i','',$cost);

}

как я понял, после точки могут идти 3 нуля

Share this post


Link to post
Share on other sites

А можно еще так

if(strpos($cost,'.00')>0){

$cost = substr($cost,0,strpos($cost,'.')-1);

}

Edited by esculapra

Share this post


Link to post
Share on other sites

Есть еще один коварный метод

$a = explode('.',$cost):

if($a[1]=='000')

$cost = $a[0];

Share this post


Link to post
Share on other sites

Спасибо всем за варианты, буду пробовать

1 час назад, chukcha сказал:

str_replace('.00',''

Не понял это выражение (

22 минуты назад, esculapra сказал:

Но вначале нужно прописать условие if(preg_match('/(\.){1}(0){3}/i',$cost)) {

$cost = preg_replace('/(\.){1}(\d)++/i','',$cost);

}

как я понял, после точки могут идти 3 нуля

Нет, возможны только два знака после запятой (установлено в настройках)

Share this post


Link to post
Share on other sites
2 минуты назад, den4ikm сказал:

Не понял это выражение

То есть в переменной заменяет точку и 2 нолик на пустое значение.$cost = str_replace('.00',''.$cost);

 

если только 2 нуля, тогда

if(preg_match('/(\.){1}(0){2}/i',$cost)) {

$cost = preg_replace('/(\.){1}(\d)++/i','',$cost);

}

Попробуй мой метод с массивом - там четко сработает.

Share this post


Link to post
Share on other sites
Только что, esculapra сказал:

Попробуй мой метод с массивом - там четко сработает.

Сам алгоритм таков:

- переменная переносится в массив с двумя значениями

- проверяется число после точки, и если это не нули, то ничего не делает, иначе в переменную заносится только целочисленное значение.

Share this post


Link to post
Share on other sites
1 час назад, esculapra сказал:

То есть в переменной заменяет точку и 2 нолик на пустое значение.$cost = str_replace('.00',''.$cost);

 Выберу это, регулярки я вообще не понимаю.

Благодарю за помощь

Share this post


Link to post
Share on other sites

В связи с вопросами в личку выкладываю итоговое решение:

/system/library/cart/currency.php

public function format($number, $currency, $value = '', $format = true) {
        $symbol_left = $this->currencies[$currency]['symbol_left'];
        $symbol_right = $this->currencies[$currency]['symbol_right'];
        $decimal_place = $this->currencies[$currency]['decimal_place'];

        if (!$value) {
            $value = $this->currencies[$currency]['value'];
        }

        $amount = $value ? (float)$number * $value : (float)$number;
        
        $amount = round($amount, (int)$decimal_place);
        
        if (!$format) {
            return $amount;
        }

        $string = '';

        if ($symbol_left) {
            $string .= $symbol_left;
        }

        $string .= number_format($amount, (int)$decimal_place, $this->language->get('decimal_point'), $this->language->get('thousand_point'));
$string = str_replace('.00','',$string);

        if ($symbol_right) {
            $string .= $symbol_right;
        }

        return $string;
    } 

Использовалось на версии OC 2.3.0.2.3

Еще раз спасибо , @AlexDW ,@esculapra,@chukcha

Edited by den4ikm

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.