web-dev-qa-db-ja.com

php:bigint型と同等のint()関数? (int()は文字列を2147483647にカットします)

php:bigintタイプに相当するint()関数は何ですか? (int()は大きな数を2147483647にカットします)?

例:

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

でも12312342306にしたいです。

13
Haradzieniec

ご覧のとおり、この種のキャストを実行するための組み込み型はありません ここ (公式ドキュメントから)。とにかく、 GMPライブラリ を使用してこの長いintを管理できます。

6
Aurelio De Rosa

私は古くて答えられていることを知っていますが、これを見ている人々の将来の参考のために:

[〜#〜]更新[〜#〜]

整数のサイズはプラットフォームに依存しますが、最大値の約20億が通常の値です(つまり、32ビットの符号付き)。 64ビットプラットフォームの最大値は通常約9E18です。ただし、PHP 7より前のWindowsでは、常に32ビットでした。 PHPは符号なし整数をサポートしていません。整数サイズは定数PHP_INT_SIZEを使用して決定でき、最大値はPHP 5.0.5以降の定数PHP_INT_MAXを使用して、最小値はPHP7.0.0以降の定数PHP_INT_MINを使用して決定できます。

ソース

8
Manatax

私はintではなくfloatにキャストすることでそれを解決しました:

(int) '8554104470' => 2147483647

(フロート) '8554104470' => 8554104470

4
Menno Bieringa

これはあなたが望んでいた種類の答えではないかもしれませんが、64ビットマシンに切り替えてみませんか?

私の(64ビットFedora)PCでは、$ bigint1の値は12312342306です。

2
tialaramex

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;
}
2
Frank Farmer
$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
1
Chemaclass

サイズが4バイトを超える整数のすべての演算に bcmath関数 を使用しています。すべてのオペランドと結果は文字列ですが、引数値としてデータベースに表示または渡すために簡単に使用できることに注意する必要があります。

0
Hink