Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Округление до 50 копеек в большую сторону


Pihaluch

Recommended Posts

Добрый день.

На сайте нужно было сделать скидки для групп покупателей.

На форумах нашел такое решение:

if ($this->config->get('config_customer_group_id') == 10) {
    $price = $price - ($price / 100) * 10;
}

Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону.

То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00

Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду.

 

Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом:

 if ($this->config->get('config_customer_group_id') == 10) {
	 $price = $price - ($price / 100) * 10;
	 $price = ceil($price / 0.5) * 0.5;
}

По логике цена должна округлиться до 12.00, а она округляется до 12.12

И такое происходит со всеми ценами, после округления получается  13.13, 14.14, 6.06, 9.09.

Подскажите в каком направлении копать? 

Возможно неверно использую функцию ceil()?

 

Заранее спасибо за ответ.

Надіслати
Поділитися на інших сайтах


1 hour ago, Pihaluch said:

И такое происходит со всеми ценами, после округления получается  13.13, 14.14, 6.06, 9.09.

Подскажите в каком направлении копать? 

Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация.

Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так:
 

Spoiler

 

 if ($this->config->get('config_customer_group_id') == 10) {
     $price = $price - ($price / 100) * 10;
     $price = ceil($price / 0.5) * 0.5;
}

$this->log->write("New price = " . $price);

 

 

Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается.

Надіслати
Поділитися на інших сайтах

2 часа назад, Pihaluch сказал:

Добрый день.

На сайте нужно было сделать скидки для групп покупателей.

На форумах нашел такое решение:


if ($this->config->get('config_customer_group_id') == 10) {
    $price = $price - ($price / 100) * 10;
}

Следующим шагом пытаюсь реализовать округление цены до 50 копеек в большую сторону.

То есть если цена 12.05 должно получиться 12.50, если цена 12.51 округляем до 13.00

Для этого я использую функцию php ceil(), но почему-то цены не приходят к нужному виду.

 

Например была цена 11.82 ( уже со скидкой), записываю округление следующим образом:


 if ($this->config->get('config_customer_group_id') == 10) {
	 $price = $price - ($price / 100) * 10;
	 $price = ceil($price / 0.5) * 0.5;
}

По логике цена должна округлиться до 12.00, а она округляется до 12.12

И такое происходит со всеми ценами, после округления получается  13.13, 14.14, 6.06, 9.09.

Подскажите в каком направлении копать? 

Возможно неверно использую функцию ceil()?

 

Заранее спасибо за ответ.

 

все это умеет делать калькулятор 

Если нет девушки  МегаКалькулятора - то есть руки 

Надіслати
Поділитися на інших сайтах

1 час назад, 100napb сказал:

Код выглядит верным. А Ваши результаты выглядят так, словно где-то срабатывает строковая конкатикация.

Ради проверки можете после блока вычислений вывести промежуточный результат в журнал ошибок опенкарта. Вот так:
 

  Показать контент

 

 if ($this->config->get('config_customer_group_id') == 10) {
     $price = $price - ($price / 100) * 10;
     $price = ceil($price / 0.5) * 0.5;
}

$this->log->write("New price = " . $price);

 

 

Посмотрите по коду ниже, какие операции над $price еще производятся. Скорее всего где-то накосячили или "неожиданно" приведение типа переменной к строке работает. Например, когда символ валюты приписывается.

 

По коду дальше с $price ничего подозрительного не происходит, но мне удалось установить от чего, как мне кажется, зависти такой вид цены.

Если поставить валюту $ то всё работает корректно. 

В настройках валюты в админке у нее стоит курс 1.0000000, а у рублей курс 2.01999998 (белорусские рубли).

Получается при округлении учитывается еще и курс?

 

Надіслати
Поділитися на інших сайтах


 

4 hours ago, Pihaluch said:

Получается при округлении учитывается еще и курс? 

смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением...

 

Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка...

$data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);

 

Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше...

Надіслати
Поділитися на інших сайтах

16 часов назад, 100napb сказал:

 

смотря в каком месте\файле Вы делаете округление. Если в контроллере products.php, то курс\конвертация там обязательно учитывается на основе значения из сесси пользователя (какая валюта у него стоит в магазине). Может быть это как-то пересекается с Вашим округлением...

 

Вот после подобной строки уже ничего не стоит делать с ценой, т.к. тут и символ валюты есть и вообще после этого в data['price'] не число, а строка...

$data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);

 

Если не разобрались еще окончательно, можете прикрепить файл с Вашими правками. А то гадать дольше...

Округление делал в файлах контроллера. Видимо поэтому и не получались правильные значения. Так как вы и сказали. 

Но вчера я нашел куда копать и у меня получилось сделать округление так как надо.

Заходим в файл \system\library\currency.php и в функции public function format() находим вот такую строчку:

$string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point);

 и меняем на такую:

$string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point);

В итоге всё округляется верно.

 

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

Я пробовал делать вот так:

if ($this->config->get('config_currency_id') == 4) {
	$string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point);
} else {
	$string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point);
}

Ничего не происходит, я так подозреваю что ошибка вот в этой строке 

($this->config->get('config_currency_id') == 4)

Подскажите пожалуйста как правильно это сделать?

Надіслати
Поділитися на інших сайтах


14 minutes ago, Pihaluch said:

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

Я пробовал делать вот так:

посмотрите в сторону $this->session->data['currency']

Надіслати
Поділитися на інших сайтах

В 19.09.2019 в 12:19, 100napb сказал:

посмотрите в сторону $this->session->data['currency']

Спасибо большое, получилось.

 

Сделал вот так 

if($this->session->data['currency']  == 'BYN') {
	$string .= number_format((ceil($value / 0.5) * 0.5), (int)$decimal_place, $decimal_point, $thousand_point);
} else {
	$string .= number_format(round($value, (int)$decimal_place), (int)$decimal_place, $decimal_point, $thousand_point);
}

Но теперь почему-то валюту 'USD' в корзине и карточке товара всё равно округляет. То есть в категориях, в поиске, всё в порядке, а в карточке и в корзине та же позиция уже идет с округленной ценой. И это только с 'USD' с 'EUR' такого нету. Почему так происходит? 

 

Я так понимаю currency.php это конечный файл, после него с ценой ничего не происходит. Получается в этом файле нужно искать решение?

Змінено користувачем Pihaluch
проблема не решена
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.