2017-12-14 6 views
2

に教義を経由して、小数点値を格納しますは、どのように私は次のように定義された製品の価格のためのSymfonyでエンティティを持っているsymfonyの

/** 
* @var string 
* 
* @ORM\Column(name="price", type="decimal", precision=12, scale=2, nullable=true) 
* 
*/ 
private $price; 

は今、私は価格の価値2.50を保存したいが、それは丸め2.00まで.Iは、(フロート)2.50又はとして(文字列)2.50として追加しようとしているが、それは常に2.00に丸められます。

スケール値を保存できないようですか?

+0

IMHO、これはDB内で処理するべきではありません。情報を表示する上で懸念されるため、ビューまたはコントローラのどちらかによって処理する必要があります。 –

+0

しかし、私はどのようにデータベースに価格の値を格納するのですか?私は250が2.50と同じではないので、ドットがどこにあるか知る必要がありますか?または、セントにすべての値を整数で格納するので、データベースに入る前に価格を取って100を掛けますか? – Tom

+2

私が過去にしたことは、ペニーを表す整数として価格を格納することです。 $ 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))を使用して、ビューに値を表示します。 –

答えて

0
/** 
    * @var float 
    * 
    * @ORM\Column(name="price", type="float", nullable=true) 
    */ 
    private $price; 
0

ストアそれ整数

としてはい、最高のは、そのための整数として、セントにそれを格納することです。ここでのトリックは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()); 
関連する問題