Php Symfony序列化程序返回字符串而不是浮点
如何配置Symfony序列化程序组件以规范化对象(实体)的浮点属性 详细说明:条令实体的Php Symfony序列化程序返回字符串而不是浮点,php,json,symfony,serialization,Php,Json,Symfony,Serialization,如何配置Symfony序列化程序组件以规范化对象(实体)的浮点属性 详细说明:条令实体的taxRate属性映射到PHP浮点值。我想从一个具有JSON表示的控制器响应,如: {taxRate:0.19} 但我得到的是 {taxRate:"0.19"} 实体属性和注释的定义如下: class ExampleEntity { /** * @ORM\Column(type="decimal", precision=3, scale=2, nullable=true) * @Group
taxRate
属性映射到PHP浮点值。我想从一个具有JSON表示的控制器响应,如:
{taxRate:0.19}
但我得到的是
{taxRate:"0.19"}
实体属性和注释的定义如下:
class ExampleEntity {
/**
* @ORM\Column(type="decimal", precision=3, scale=2, nullable=true)
* @Groups({"api"})
*/
protected $taxRate;
}
控制器如下所示:
$serializer = $this->get('serializer');
return new JsonResponse(
$serializer->normalize(
$exampleEntity,
'json',
[
'groups' => 'api',
]
)
);
我不喜欢在JavaScript端将字符串转换为浮点的解决方案。我的应用程序希望断言属性为NULL或浮点值
如何做到这一点?多亏了这些评论,我认为这个问题不是很清楚/可以删除 序列化过程很好,这是我没有正确理解的原则的映射 这完全没问题,DECIMAL/MySQL类型映射到PHP字符串。
十进制是为了保证数值的精度而设计的。PHP的浮点类型不能保证相同的精度 我对Symfony 4.4 serializer也有同样的问题,我不同意您的解决方案。我通过将type=“decimal”更改为type=“float”解决了我的问题,正如一些人在评论中所建议的那样。正确的暗示类型是一种很好的做法。既然可以使用浮点数,为什么还要使用字符串 浮动类型,来自条令文档:
/**
* @var float|null
* @ORM\Column(type="float", precision=6, scale=2, nullable=true)
*/
protected $ratio;
/**
* @return float|null
*/
public function getRatio(): ?float
{
return $this->ratio;
}
/**
* @param float|null $ratio
* @return $this
*/
public function setRatio(?float $ratio): self
{
$this->ratio = $ratio;
return $this;
}
以浮点精度映射和转换数字数据。如果你
只需要分数的数字的近似精度,就可以了
应该考虑使用这种类型。从数据库检索的值
总是转换为PHP的float/double类型,如果没有数据,则转换为null
现在
有关此方法的一些附加信息:
/**
* @var float|null
* @ORM\Column(type="float", precision=6, scale=2, nullable=true)
*/
protected $ratio;
/**
* @return float|null
*/
public function getRatio(): ?float
{
return $this->ratio;
}
/**
* @param float|null $ratio
* @return $this
*/
public function setRatio(?float $ratio): self
{
$this->ratio = $ratio;
return $this;
}
- 如果您使用服务容器很好地实例化了ORM注释,那么Symfony序列化程序将读取ORM注释
- SyfOffice序列化器完全考虑浮动作为浮动
- 信条需要一个浮点精度,PHP不需要,这是完全可以的。您可以在数据库中插入一个浮点数,必要时规则将对其进行取整
/**
* @var float|null
* @ORM\Column(type="float", precision=6, scale=2, nullable=true)
*/
protected $ratio;
/**
* @return float|null
*/
public function getRatio(): ?float
{
return $this->ratio;
}
/**
* @param float|null $ratio
* @return $this
*/
public function setRatio(?float $ratio): self
{
$this->ratio = $ratio;
return $this;
}
对于decimal类型,从数据库检索的值总是转换为PHP的字符串类型,如果没有数据,则转换为null 如果要使用decimal,请更改getter for属性
public function getTaxRage(): ?float
{
return is_string($this->taxRate) ? (float) $this->taxRate : $this->taxRate;
}
try
type=“float”
@sietse85type=“float”
将是orm映射配置。。。symfony序列化程序没有考虑到这一点。真的吗?我试过了,效果很好。这在哪里有记录?因为那个注释是为了教义,对吧?2.我认为十进制更安全,因为MySQL浮点类型需要PHP语言环境使用“.”作为浮点分隔符,但情况并非总是如此。3.非常感谢。4.有没有办法坚持十进制并实现到浮点/双精度的转换?(这就是我一直认为的)@nifr你是对的。但是由于sietse85的评论,我意识到“错误”的转换发生在序列化之前。我不知道DECIMAL被映射/转换为PHP字符串。是我的错。现在我对这个事实有点不高兴:)好的。您可以将GetSetMethodNormalizer
与public function getTaxRate():float{return(float)$this->taxRate;}
和public function setTaxRate($taxRate){$this->taxRate=(float)$taxRate;}
一起使用来防止这些转换问题。