在symfony 2中验证小数

zer*_*kms 5 php symfony

我使用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

好吧,如果不是 - 那么可能有一个解决方案来验证它.有任何想法吗?

Jam*_*all 6

从查看Symfony文档,没有内置的小数验证器.您可以使用回调验证程序,或者更好的是您可以创建自己的自定义验证程序,如本文所述.

至于实际的验证,我会使用的组合is_numericis_float检查.有一些方法使用正则表达式,但在我看来,如果值满足is_numericis_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或逗号相结合(取决于您是否要满足欧洲小数格式).