Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 验证symfony 2中的小数_Php_Symfony - Fatal编程技术网

Php 验证symfony 2中的小数

Php 验证symfony 2中的小数,php,symfony,Php,Symfony,我使用条令将symfony2实体映射到一个表。其中一个属性是: /** * @var decimal $price * * @ORM\Column(name="price", type="decimal", nullable=false) */ private $price; 什么断言可以满足我的要求,$price应该是有效的小数 如果我保持原样,那么将字符串foo作为十进制值传递将导致验证错误,而传递字符串NaN则通过验证,因为字符串NaN映射为float(NaN),因此被视为有效的

我使用条令将symfony2实体映射到一个表。其中一个属性是:

/**
 * @var decimal $price
 *
 * @ORM\Column(name="price", type="decimal", nullable=false)
 */
private $price;
什么
断言
可以满足我的要求,
$price
应该是有效的小数

如果我保持原样,那么将字符串
foo
作为十进制值传递将导致验证错误,而传递字符串
NaN
则通过验证,因为字符串
NaN
映射为
float(NaN)
,因此被视为有效的十进制值

有解决办法吗

Symfony开发团队确保这不是一个问题:


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

您可以尝试一种只检查该字符串的方法。

查看Symfony文档,没有一个内置的小数校验器。您可以使用回调验证器,或者更好的是,您可以像本文一样创建自己的自定义验证器

至于实际验证,我将使用
is\u numeric
is\u float
的组合进行检查。有使用regex的方法,但在我看来,如果该值满足
是数值
是浮点
检查,那么您可以放心地假设它是有效的十进制(或整数)

编辑:

也许最好的解决方案是将十进制作为字符串进行验证。类似于

$stringDecimal = strval($decimalValue);
return (preg_match(/[0-9]+(\.[0-9][0-9]?)?/, $stringDecimal) !== 0);

虽然这并不完美(你可以轻松通过“1.15adowadjaow”并进行验证),但它是你追求的基础。将上述正则表达式与搜索除0-9、fullstop或逗号以外的任何内容相结合(取决于您是否希望符合欧洲十进制格式)。

如果您使用表单类型进行记录

        ->add(
            'amount',
            'text', change text to number and it will be validated 
            [
                'required' => true
            ]
        )
或者可以使用范围断言

  • @断言\范围(最小值=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;

谢谢

是的,我知道这种可能性,但令人厌恶的是,他们提供的类型没有检查它是否有效的可能性,“只检查那个字符串。”——这实际上是一个糟糕的解决方案。我不可能知道任何神奇的弦。我想检查数据是否有效,而不是检查数据是否无效。
float(NaN)
同时通过
is\u float
is\u numeric
如何首先将其转换为字符串,并检查值是否不等于'NaN'?@zerkms您是对的,转换更像是一个净化过程,而不是验证,一种更合适的方法可能是调用strval(),然后使用regex验证字符串,我将更新我的答案这太奇怪了:-s奇怪SF2中没有内置的东西:-S@zerkms我同意,我很惊讶盒子里没有什么东西。。。我想我会把它作为一个问题报告到Github上,如果有人需要在验证中允许'NaN'怎么办?只需编写自己的转换器“非十进制”;)@meze:omg)我需要做多少步骤才能从How-to中得到基本示例?;-)您说“NaN”是十进制的有效值,然后希望将其转换为0,因为您希望这样;)@梅兹:根据验证器,我说它是有效的。对于我(和数据库)-它不是有效值我看不出orm有任何问题,它为price字段设置了空值。另外,你不能在setter中规范价格吗?
float(NaN)
是一个数字,不是吗?Plus
min=0
具有不同的语义。