Symfony2表单编号输入超过20亿

时间:2016-08-02 04:34:40

标签: php symfony

我正在寻求关于我的Symfony数字输入问题的一些帮助,如下所述。我希望能够在我的表单中输入非常大的数字,但目前仅限于大约20亿的最大值。

我有一个名为Transaction的实体,其字段名为" quantity"已被定义为BIGINT,如下所示:

/**
 * @ORM\Column(type="bigint", nullable=true)
 */
protected $quantity;

允许我填充交易的Symfony表单使用"数字"类型:

    $builder->add('quantity', 'number', array(
        'label'             => 'Quantity',
        'grouping'          => 1,
        'required'          => true,
    ));

这一切都像魅力一样,除非数量值高于约。 20亿(我还没有确切地证实这个数字)。对我来说,它看起来像32位边界问题。

当发生这种情况时,它会抱怨"数字解析失败"。在下面的屏幕截图中我输入了30亿,它出现了这个错误:

Example when I enter 3 billion

我不相信问题是Transaction实体中的bigint,因为这是一个8字节的值,应该能够容纳64位数据。

我正在使用Symfony 2.7.16(此问题在早期版本中是相同的)。任何帮助或建议最受欢迎。

谢谢!

2 个答案:

答案 0 :(得分:9)

是的,这是32位问题。你可以输入

来确认
php -r 'echo PHP_INT_MAX;'
2147483647

如果您可以安装64位php build,我建议使用http://dotdeb.org,因为它们提供最新的稳定版本。

要确保您的应用程序未在32位上运行,请添加到composer.json

"require": {
    "php-64bit": ">=5.3.9"
}
如果您尝试在非64位系统上安装,

Composer将失败

如果无法使用64位

你需要处理我害怕的字符串。

创建扩展TextType的自定义表单类型并将值保持为字符串,但通过覆盖呈现为数字输入

/**
 * {@inheritdoc}
 */
public function getBlockPrefix()
{
    return 'integer';
}

答案 1 :(得分:1)

32位中的最大整数,默认值为2,147,483,647。

  

整数的大小取决于平台,尽管最大值约为20亿是通常的值(32位签名)。 PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE来确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX来确定。

如果您实际使用的是64位操作系统,则必须更改php.ini中的PHP_INT_SIZE。

你也可以升级到PHP 7并使用" long"而不是" int"