эквивалент функции php: int () для типа bigint?(int () обрезает строки до 2147483647) - PullRequest
11 голосов
/ 12 ноября 2011

php: Какая эквивалентная функция int() для типа bigint? (int() сокращает большие числа до 2147483647)?

Пример:

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

но я хочу, чтобы оно было 12312342306.

Ответы [ 7 ]

8 голосов
/ 08 февраля 2013

Я знаю, что старый и ответил, но для будущих людей, которые смотрят на это:

ОБНОВЛЕНО

Размер целого числа зависит от платформы, хотя максимальное значение около двух миллиардов является обычным значением (это 32 бита со знаком). Максимальное значение для 64-разрядных платформ обычно составляет около 9E18, за исключением Windows до PHP 7, где оно всегда было 32-разрядным. PHP не поддерживает целые числа без знака. Целочисленный размер можно определить с помощью константы PHP_INT_SIZE, максимальное значение с помощью константы PHP_INT_MAX начиная с PHP 5.0.5 и минимальное значение с использованием константы PHP_INT_MIN начиная с PHP 7.0.0.

Источник

6 голосов
/ 12 ноября 2011

Нет встроенного типа для такого рода приведения, как вы можете видеть здесь (из официального документа). В любом случае, вы можете использовать библиотеку GMP для управления этим длинным целым.

3 голосов
/ 04 сентября 2015

Я решил это, приведя к float вместо int:

(int) '8554104470' => 2147483647

(float) '8554104470' => 8554104470

2 голосов
/ 12 ноября 2011

Очевидно, невозможно воспроизвести функцию (int) точно для 64-разрядных чисел в 32-разрядной системе. (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;
}
2 голосов
/ 12 ноября 2011

Возможно, это не тот ответ, который вы хотели, но почему бы не перейти на 64-разрядную машину?

На моем (64-битном компьютере Fedora) ПК $ bigint1 имеет желаемое значение 12312342306.

1 голос
/ 12 декабря 2017
$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
0 голосов
/ 07 ноября 2018

Я использую bcmath functions для всех операций с целым числом размером> 4 байта.Следует помнить, что все операнды и результаты являются строками, но их легко использовать для отображения или передачи в базу данных в качестве значений аргументов.

...