• ベストアンサー

ある文字列の最後の2桁で分解し配列にする方法・・・

こんにちは。 ある12桁~24桁の数字に+1をした数字を表示しようとしています。 int型とfloat型が16桁以上の数字が扱えないようなので、おかしくなってしまいます・・・ 1111111111111111の数字に+1をすると 1.1111111111111E+15となります・・・。 これをどうにかできるようにしたいので、 この数字の最後の2桁で文字を分解し その2桁に+1をして、 再び 最後の2桁とそれ以前の文字列とを足して 元の桁数にしようと考えました。 しかし、この最後の2桁で文字を分解し、各変数か配列に収める方法がわかりません・・・ 何かよい方法もしくは関数などありませんか? どうか、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

長い数値で構成される文字列に+1するなら、単純に計算すればいいかも。 サンプル <?php function str_add1($numStr){ $rev = strrev($numStr);#逆にする $len = strlen($numStr);#桁数を求める $carry = 1; for($i=0;$i<$len;$i++){ $n=ord($rev[$i])-ord("0") + $carry; if($n>9){ $carry=1; $n-=10; } else { $carry=0; } $rev[$i]=chr(ord("0")+$n); } if($carry==1){ $rev .= $carry; } return strrev($rev); } $longNumStr="1234567890123456789012345"; print str_add1($longNumStr); print "\n"; print str_add1("99999999999999999999"); ?>

amountainblast
質問者

お礼

ご回答ありがとうございます。 見事に解決しました。 なるほどこんな方法があったんですね・・・ 勉強になりました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

PEARを使う方法もあります <?php include_once 'Math/IntegerOp.php'; $i1 = new Math_Integer('111111111111111111111111'); $i2 = new Math_Integer('1'); $res = Math_IntegerOp::add($i1, $i2); echo 'i1 + i2 = '.$res->toString()."\n"; ?>

amountainblast
質問者

お礼

ご回答ありがとうございます。 サーバーの環境上PEARを使用することができませんので、 確認をすることが出来ませんでした・・・ 問題は#2の方の回答で解決しました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

111・・・を10進数で取り扱うにはphpは精度が 足りないようです。 もし2進数であれば、10進数計算で4294967295まで 数値として扱えるようですが、いかがでしょうか? <?PHP print decbin(4294967295); ?>

amountainblast
質問者

お礼

回答ありがとうございます。 2進数での扱いですが、 111・・・の段階で2進数にするのは考えましたが+1の仕方がわからずに断念しました・・・ できれば、このあたりを教えて頂けないでしょうか? >10進数計算で4294967295 ですが、4294967295だと10桁までしか数値で扱えないとうことでしょうか? マックスで24桁まで扱いますので、これだと無理だと思うのですが・・・

すると、全ての回答が全文表示されます。

関連するQ&A