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

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


Recommended Posts

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

<?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 користувачів

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

Important Information

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