当我尝试使用小数值保存“百分比”类型的Symfony 2.8表单字段时,验证返回
此值不应为null。
我按照说明在我的实体中设置了字段:
/**
* @var decimal
*
* @ORM\Column(
name="total_percent",
type="decimal",
precision=14,
scale=8,
nullable=false
)
* @Assert\NotNull()
*/
private $percent;
我创建了我的字段:
->add('percent',
PercentType::class,
array(
'scale' => 8,
'attr' => array('class' => 'percent_field'))
)
我已经仔细检查了数据库,我可以使用分数创建条目,因此问题似乎与Symfony的形式有关。但是,我在代码中找不到该问题。 有没有人成功实现过这个。从本质上讲,我希望能够节省1.5%的百分比。 任何有建设性的想法(与手头的问题有关)都会受到赞赏。
答案 0 :(得分:1)
精度:小数(精确数字)列的精度(适用 仅适用于十进制列),即最大位数 存储为值。
比例:小数(精确数字)列的比例(仅适用 对于十进制列),表示到的数字位数 小数点右边,不得大于精度。
要存储一个简单的百分比值,例如1.5
%以及从0.0
到100.0
的相对(正)范围,您应该修改列映射:
/**
* @var decimal
*
* @ORM\Column(
* name="total_percent",
* type="decimal",
* precision=4, # <-- THIS IS NEEDED TO BE ALLOWED TO STORE ALSO 100.0,
* scale=1, # <-- THIS ALLOWS ONLY 1 DECIMAL
* nullable=false
* )
* @Assert\NotNull()
* @Assert\Range(
* min = 0,
* max = 100,
* minMessage = "Min % is 0",
* maxMessage = "Max % is 100"
* )
*/
private $percent;
和表单字段:
->add('percent',
PercentType::class,
array(
'type' => 'integer', # <-- SET THE TYPE AS INTEGER!
'scale' => 1,
'attr' => array('class' => 'percent_field')
)
)
要避免使用高于100.0
的值,请使用我的示例中的Range
约束。
在我的测试中,这个配置效果非常好,允许使用逗号分隔十进制,例如&#34; 34,2
&#34;或&#34; 1,5
&#34;以及&#34; 23,5543
&#34;等所有值将四舍五入到最接近缺陷或超额的值(在这种情况下将是&#34; 23,6
&#34;)。