Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Размер скидки в процентах


 Поделиться

Рекомендованные сообщения

Прошу помочь. Не могу разобраться откуда растут ноги. Делаю вывод скидки в процентах:

<?php echo round(100-($product['special']/$product['price'])*100); ?> или <?php echo round(100-($product['special']/($product['price']/100))); ?>

Выводится полная херня. К примеру, новая цена 22795, старая 23500 - т.е. разница ровно 3%. Но в выводе -4%.

А если фактический размер скидки меньше 3% - то в выводе 0%.

 

При этом размер скидки в рублевом эквиваленте выводится норм.

 

Валюта по-умолчанию рубль, значение 1.00000, кол-во нулей после запятой 0.  Цены с налогом выключены. При этом болтается налоговая ставка - которую не могу удалить, но изменение ее значения никак не влияет на процент.

 

Всю голову сломал, прошу подсказку, где искать косяк.

Ссылка на комментарий
Поделиться на других сайтах


проверьте что фактически в переменных $product['special'] / $product['price']

возможно причина в том, что пытаетесь работать с отформатированными ценами

пробуйте использовать (float)

Ссылка на комментарий
Поделиться на других сайтах

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

проверьте что фактически в переменных $product['special'] / $product['price']

возможно причина в том, что пытаетесь работать с отформатированными ценами

пробуйте использовать (float)

Деление $product['special'] / $product['price'] = 22795/23500 - в выводе 0.95652173913043, по факту должно быть 0.97. (float)$product['special']/(float)$product['price'] - аналогичный результат. Подскажите, пожалуйста, формат цен задается только в контроллере товара или где-то еще?


 

 

Ссылка на комментарий
Поделиться на других сайтах


system/library/cart/currency.php - подсунул оригинал из opencart 2.3 - результата нет. Проверил на наличие модификаторов, затрагивающих этот файл - моды отсуствуют.

Ссылка на комментарий
Поделиться на других сайтах


24 minutes ago, Padlik said:

Деление $product['special'] / $product['price'] = 22795/23500 - в выводе 0.95652173913043, по факту должно быть 0.97. (float)$product['special']/(float)$product['price'] - аналогичный результат. Подскажите, пожалуйста, формат цен задается только в контроллере товара или где-то еще?

 

Проверил на PHP7, PHP8 - результат везде 0.97
v7.4.15, v8.0.2
 

<?php
echo 22795 / 23500;
echo (float)22795 / (float)23500;
echo '22795 грн' / '23500 грн';

Вы точно цены не из админки берёте, а выводили на экран или в лог?

Изменено пользователем rb2
versions
Ссылка на комментарий
Поделиться на других сайтах


6 минут назад, rb2 сказал:

Проверил на PHP7, PHP8 - результат везде 0.97
v7.4.15, v8.0.2
 


<?php
echo 22795 / 23500;
echo (float)22795 / (float)23500;
echo '22795 грн' / '23500 грн';

Вы точно цены не из админки берёте, а выводили на экран или в лог?

Не из админки, вывод в шаблон товара. Попробовал тупо <?php echo 1/2; ?>  - в шабе 0.5 - как положено.

 

Пробую так <?php echo $product['price']/2; ?> (price - 23500) - результатом является 11.5)))))

<?php echo $product['special']/2; ?> (special - 22795) - результатом является 11)))))

 

Хоть убейте, не пойму где ломается цена при форматировании. В моделе товара чисто, currency.php оригинальный, без изменений. Смущает контроллер:

    if ((float)$product_info['special']) {
                $data['special'] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
            } else {
                $data['special'] = false;
            }

Пробовал убрать форматирование  $data['special']= $product_info['special'] - получается вообще полная херня. Работаю на php 5.6.4 в режиме CGI

 

 

Ссылка на комментарий
Поделиться на других сайтах


Ребят, разобрался. Проблема была следующая, кто-то ковырял языковой файл и сделал разделитель тысяч пробелом, отсюда кривые расчеты)))

$_['thousand_point']        = ' ';

 

Теперь у меня новый вопрос. Пофиксил я кривые расчеты, а разделитель тысячных остался нужен. Погуглил, везде основное решение - это как раз сделать пробел разделителем, однако, как показала практика - решение так себе. Можно каким-то образом расчеты производить, игнонируя этот пробел?

Изменено пользователем Padlik
Ссылка на комментарий
Поделиться на других сайтах


по уму - считать всю логику нужно не в шаблоне, а в контроллере

на основе чистых не форматированных цен

тогда и проблем не будет с разделителями/символами валют и прочим

Ссылка на комментарий
Поделиться на других сайтах

В общем да, не кашерно в шаблоне считать. Добавил в контроллер вычисление без форматирования цены и вернул разделитель тысячных пробелом:
$skidka = round(100-((float)$product_info['special']/((float)$product_info['price']/100)));

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.