ストアそれ整数
としてはい、最高のは、そのための整数として、セントにそれを格納することです。ここでのトリックはDataTransformer
です。
エンティティ
/**
* Price of the option (in cents)
*
* @ORM\Column(type="integer", nullable=true)
*/
protected $price = 0;
/**
* @param int $price
*/
public function setPrice(?int $price): self
{
$this->price = $price;
return $this;
}
/**
* @return int
*/
public function getPrice(): ?int
{
return $this->price;
}
データトランス
<?php
namespace App\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
class CentToDollarTransformer implements DataTransformerInterface
{
/**
* Transforms cent to dollar amount.
*
* @param int|null $priceInCent
* @return double
*/
public function transform($priceInCent)
{
if (null === $priceInCent) {
return;
}
$priceInDollar = number_format(($priceInCent /100), 2, '.', ' ');
return $priceInDollar;
}
/**
* Transforms dollar to cent amount.
*
* @param double|null $priceInDollar
* @return int
*/
public function reverseTransform($priceInDollar)
{
if (null === $priceInDollar) {
return;
}
$priceInCent = (int)($priceInDollar * 100);
return $priceInCent;
}
}
フォームタイプ
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use App\Form\DataTransformer\CentToDollarTransformer;
// ...
$builder->add('price', MoneyType::class, array(
'scale' => 2,
'currency' => null,
'label' => 'form.price',
'attr' => array(
'min' => '0.00',
'max' => '1000.00',
'step' => '0.01'
)
));
$builder->get('price')
->addModelTransformer(new CentToDollarTransformer());
IMHO、これはDB内で処理するべきではありません。情報を表示する上で懸念されるため、ビューまたはコントローラのどちらかによって処理する必要があります。 –
しかし、私はどのようにデータベースに価格の値を格納するのですか?私は250が2.50と同じではないので、ドットがどこにあるか知る必要がありますか?または、セントにすべての値を整数で格納するので、データベースに入る前に価格を取って100を掛けますか? – Tom
私が過去にしたことは、ペニーを表す整数として価格を格納することです。 $ 2.50は250、$ 250.00は25000になります。['number_format'](http://php.net/manual/en/function.number-format.php)(または[Twig相当](https:// twig .symfony.com/doc/2.x/filters/number_format.html))を使用して、ビューに値を表示します。 –