Php: int()函数等效的bigint类型?(int()将字符串切割为2147483647)


php: int() function equivalent for bigint type? (int() cuts strings to 2147483647)

php: bigint类型的等效int()函数是什么?(int()把大数字切成2147483647)?

的例子:

$bigint1="12312342306A_C243";
$bigint1=(int)$bigint1;//2147483647

但是我想把它改成12312342306

我知道这是老掉牙的回答,但为了将来参考的人看这个:

整数的大小与平台有关,尽管通常值的最大值约为20亿(即32位带符号)。64位平台的最大值通常约为9E18,除了PHP 7之前的Windows,它总是32位。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE来确定,最大值从PHP 5.0.5开始使用常量PHP_INT_MAX,最小值从PHP 7.0.0开始使用常量PHP_INT_MIN。源

没有内置类型来进行这种类型的强制转换,您可以在这里看到(来自官方文档)。无论如何,您可以使用GMP库来管理这个长int.

我通过将其强制转换为float而不是int来解决这个问题:

(int)'8554104470' => 2147483647

(浮动)'8554104470' => 8554104470

这可能不是您想要的答案,但是,为什么不切换到64位计算机呢?

在我的(64位Fedora) PC上,$bigint1的值为12312342306。

显然不可能在32位系统上完全复制64位数字的(int)功能。(int)返回int类型;在32位系统上,对于64位数字,你能做的最好的事情就是返回一个字符串——但这可能就是你真正想要的。

正如tialaramex所指出的,如果你要做很多64位整数的工作,你应该运行64位PHP。如果这不是一个选项,您可以使用bcmath函数来完成一些工作——尽管我没有看到bcmath函数来完成您所要求的工作。

我只写一个简单的函数:

<?php
var_dump(toint("12312342306A_C243"));
function toint($str) {
        return preg_match('/^[0-9]+/', $str, $matches) ? $matches[0] : 0;
}
$bigint1="12312342306A_C243";
$bigint1=(int)$bigint1;//2147483647

如果你想要的只是数字,直到第一个字符不是一个数字(正如你提到的,你只是想要12312342306),那么我建议只是削减字符串,采取你想要的,然后把它转换成int

function parseBigInt(string $bigInt, string $delimiter = '_'): int
{
  if (false !== ($pos = strpos($bigInt, $delimiter))) {
      $bigInt = substr($bigInt, 0, $pos);
  }
  return (int)$bigInt;
}
$bigInt = parseBigInt('12312342306A_C243'); // '12312342306' as int

我使用bcmath函数的所有操作与大小> 4字节的整数。您必须记住,所有的操作数和结果都是字符串,但易于作为参数值显示或传递给数据库。