Php 验证symfony 2中的小数
我使用条令将symfony2实体映射到一个表。其中一个属性是: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),因此被视为有效的
/**
* @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)
是一个数字,不是吗?Plusmin=0
具有不同的语义。