在symfony 2中验证小数

时间:2012-01-23 22:42:14

标签: php symfony

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

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

4 个答案:

答案 0 :(得分:6)

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

至于实际验证,我会使用is_numericis_float的组合进行检查。有一些方法使用正则表达式,但在我看来,如果值满足is_numericis_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
            ]
        )

或者您可以使用范围断言

  • @Assert \ Range(min = 0)

它将验证它应该是数字

答案 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;

谢谢!