2017-12-14 2 views
2

ich ein Unternehmen in Symfony für ein Produkt Preis haben auf folgende Weise definiert:Wie Dezimalwert über Lehre in Symfony speichern

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

Jetzt möchte ich 2.50 den Preis Wert speichern, aber es rundet bis zu 2.00 .i als (float) versucht hat, das Hinzufügen 2,50 oder als (string) 2,50 aber immer 2,00 abgerundet ist.

Sieht so aus, als könnte ich den Skalenwert nicht speichern?

+0

IMHO, dies sollte nicht behandelt werden in der DB, es ist ein Anliegen für die Anzeige der Informationen und als solche sollte entweder von der Ansicht oder der Controller behandelt werden. –

+0

Aber wie speichere ich dann einen Preis in der Datenbank? Ich muss wissen, wo der Punkt ist, wie 250 ist nicht das gleiche wie 2,50? Oder speichern Sie alle Werte als ganze Zahl in Cent, also nehmen Sie den Preis und multiplizieren Sie ihn mit 100, bevor er in die Datenbank geht? – Tom

+2

Was ich in der Vergangenheit getan habe, ist, den Preis als eine ganze Zahl zu speichern, die Pennies darstellt; $ 2.50 wird 250 und $ 250.00 wird zu 25000. Verwenden Sie dann ['number_format'] (http://php.net/manual/en/function.number-format.php) (oder das [Twig-Äquivalent] (https: // twig (.symfony.com/doc/2.x/filters/number_format.html)), um den Wert in der Ansicht anzuzeigen. –

Antwort

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

Bewahren Sie es als eine ganze Zahl

Ja, das Beste ist, es in Cent zu speichern, also als Integer. Der Trick hier ist, eine DataTransformer zu verwenden.


Entity

/** 
* 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; 
} 

Daten Transformator

<?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; 
    } 
} 

Formulartyp

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());