我使用Doctrine将symfony2实体映射到表.其中一个属性是:
/**
* @var decimal $price
*
* @ORM\Column(name="price", type="decimal", nullable=false)
*/
private $price;
Run Code Online (Sandbox Code Playgroud)
什么Assert会满足我的要求,$price应该是一个有效的小数?
如果我保持原样,那么将字符串foo作为十进制值传递将导致验证错误,同时传递字符串NaN传递验证,因为字符串NaN被映射为float(NaN)因此被视为有效的十进制值.
任何解决方法?
Symfony开发团队确保它不是问题:https://github.com/symfony/symfony/issues/3161
好吧,如果不是 - 那么可能有一个解决方案来验证它.有任何想法吗?
从查看Symfony文档,没有内置的小数验证器.您可以使用回调验证程序,或者更好的是您可以创建自己的自定义验证程序,如本文所述.
至于实际的验证,我会使用的组合is_numeric和is_float检查.有一些方法使用正则表达式,但在我看来,如果值满足is_numeric或is_float检查,那么你可以放心地假设它是一个有效的十进制(或整数).
编辑:
也许最好的解决方案是将十进制验证为字符串.就像是...
$stringDecimal = strval($decimalValue);
return (preg_match(/[0-9]+(\.[0-9][0-9]?)?/, $stringDecimal) !== 0);
Run Code Online (Sandbox Code Playgroud)
虽然这不是完美的(你可以很容易地通过'1.15adowadjaow'并且它会验证),但它是你所追求的基础.将上述正则表达式与搜索除0-9之外的任何内容,fullstop或逗号相结合(取决于您是否要满足欧洲小数格式).