Yii2 геттеры и усилители сеттеры для форматирования строки с плавающей точкой

Итак, в настоящее время есть эта функция в контроллере, которая вызывается несколько раз.

public function formatFloat($value)
{
return (float)sprintf('%0.6f', $value);
}

Поэтому я пытаюсь использовать геттеры и сеттеры, чтобы я мог просто использовать

$model->$whatever;

и форматирование будет сделано.

В моей модели у меня есть

public function getChargePeak()
{
return $this->charge_peak;
}

public function setChargePeak($value)
{
return $this->charge_peak = (float)sprintf('%0.6f', $value);
}

но когда делаешь

 $peak = $model->chargepeak;
var_dump($peak);die;

это все еще возвращается как строка

2

Решение

Если свойство charge_peak хранится в виде строки, и вам нужно использовать float в вашем приложении, вы должны использовать

public function getChargePeak()
{
return floatval($this->charge_peak);
}

В любом случае, вы должны хранить значения согласованным образом при использовании значений в вашем приложении.

http://php.net/manual/en/function.floatval.php

1

Другие решения

Поэтому я предлагаю вам другой шаблон: декоратор и помощники. Вы должны использовать контроллер только для получения данных из запроса, подготовки их к модели и отправки их для просмотра.

Форматирование значений является вспомогательной логикой. Так что создайте новый класс
\ Common \ хелперы \ Number.php

namespace common\helpers;

class Number
{
public static function formatFloat($value)
{
return (float)sprintf('%0.6f', $value);
}
}

Затем создайте декоратор для вашей модели:

namespace common\models\decorators;

class YourModelDecorator
{

/**
* YourModel
*/
private $model;

public function __construct(YourModel $model)
{
$this->model = $model;
}

public function __get($name)
{
$methodName = 'get' . $name;
if (method_exists(self::class, $methodName)) {
return $this->$methodName();
} else {
return $this->model->{$name};
}
}

public function __call($name, $arguments)
{
return $this->model->$name($arguments);
}

public function getChargePeak()
{
return \common\helpers\Number::formatFloat($this->model->charge_peak);
}
}

и отправьте его для просмотра, например:

public function actionView($id)
{
$model = $this->loadModel($id);

$this->render('view', [
'model' => new \common\models\decorators\YourModelDecorator($model)
]);
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector