Specialprice и finalprice не возвращают десятичные дроби


Magento 2 возвращает обычную цену, отличную от специальной и окончательной цены. Ожидаемый результат:

$product->getPrice(); // 89,95
$product->getPriceInfo()->getPrice('regular_price')->getAmount()->getValue(); // 89,95
$product->getSpecialPrice(); // 49,95
$product->getPriceInfo()->getPrice('special_price')->getAmount()->getValue(); // 49,95
$product->getFinalPrice(); // 49,95
$product->getPriceInfo()->getPrice('final_price')->getAmount()->getValue(); // 49,95

Заданный результат:

$product->getPrice(); // 89,95
$product->getPriceInfo()->getPrice('regular_price')->getAmount()->getValue(); // 89,95
$product->getSpecialPrice(); // 49
$product->getPriceInfo()->getPrice('special_price')->getAmount()->getValue(); // 49
$product->getFinalPrice(); // 49
$product->getPriceInfo()->getPrice('final_price')->getAmount()->getValue(); // 49

Каким-то образом специальные и окончательные цены возвращаются без десятичных знаков. Я пробовал разные вещи с разными помощниками (например, с налоговым агентом и т. Д.), Но безуспешно. Почему Magento 2.3 продолжает возвращать специальную цену без десятичных знаков?

РЕДАКТИРОВАТЬ: И если это нормальное поведение, каков был бы правильный способ получить специальная и окончательная цена в моем модуле без символов валюты и т.д., но с учетом налога?

Author: Tober, 2019-04-15

1 answers

Если вы посмотрите следующий класс:

Vendor/magento/module-catalog/Pricing/Price/SpecialPrice.php

/**
 * Returns special price
 *
 * @return float
 */
public function getSpecialPrice()
{
    $specialPrice = $this->product->getSpecialPrice();
    if ($specialPrice !== null && $specialPrice !== false && !$this->isPercentageDiscount()) {
        $specialPrice = $this->priceCurrency->convertAndRound($specialPrice);
    }
    return $specialPrice;
}

Фактически следующая цена формата строки:

$это ->Валюта цены ->Конвертация вокруг ($Специальная цена)

Теперь перейдите в следующий класс:

Vendor/magento/module-directory/Model/PriceCurrency.php

И проверьте следующий код

/**
 * Round price with precision
 *
 * @param float $price
 * @param int $precision
 * @return float
 */
public function roundPrice($price, $precision = self::DEFAULT_PRECISION)
{
    return round($price, $precision);
}

Проверьте документацию для раунда как ну что ж

Вот примерный пример:

<?php

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06
 1
Author: Sohel Rana, 2019-04-15 16:15:05