我使用Doctrine将symfony2实体映射到表。其中一个属性是:
/**
* @var decimal $price
*
* @ORM\Column(name="price", type="decimal", nullable=false)
*/
private $price;
Assert
满足我$price
应该是有效小数的要求是什么?
如果我保持原样,那么将字符串foo
作为十进制值传递将导致验证错误,而传递字符串NaN
会通过验证,因为字符串NaN
被映射为float(NaN)
因此被视为有效的十进制值。
有任何解决方法吗?
Symfony开发团队确保这不是问题:https://github.com/symfony/symfony/issues/3161
好吧,如果不是 - 那么可能有一个解决方案来验证它。有什么想法吗?
答案 0 :(得分:6)
从查看Symfony文档,没有内置的小数验证器。您可以使用回调验证程序,或者更好的是您可以创建自己的自定义验证程序,如本文describes here。
至于实际验证,我会使用is_numeric
和is_float
的组合进行检查。有一些方法使用正则表达式,但在我看来,如果值满足is_numeric
或is_float
检查,那么你可以放心地假设它是一个有效的十进制(或整数)。
编辑:
也许最好的解决方案是将小数字验证为字符串。有点像...
$stringDecimal = strval($decimalValue);
return (preg_match(/[0-9]+(\.[0-9][0-9]?)?/, $stringDecimal) !== 0);
虽然这并不完美(你可以很容易地通过'1.15adowadjaow'并且它会验证),但它却是你所追求的基础。将上述正则表达式与搜索除0-9之外的任何内容,fullstop或逗号相结合(取决于您是否要满足欧洲小数格式)。
答案 1 :(得分:2)
您可以尝试custom validator来检查该字符串。
答案 2 :(得分:1)
如果您使用表单类型进行记录
->add(
'amount',
'text', change text to number and it will be validated
[
'required' => true
]
)
或者您可以使用范围断言
它将验证它应该是数字
答案 3 :(得分:0)
您可以简单地使用@Assert\Type(type="Numeric")
。在symfony 3.4中进行了测试,但我认为它也可以与以前的版本一起使用。例如
/**
* @var float
*
* @ORM\Column(name="cost", type="decimal", precision=10, scale=4)
* @Assert\Type(type="Numeric")
*/
private $cost;
谢谢!