• ベストアンサー

Perlでの数字の12桁化

$aaa = 6120900000; $aaa2 = sprintf("%12d",$aaa); とするとなぜか$aaa2 は-000000000001 となってしまうのです。 006120900000となってほしいのですが希望どおりに実行されないのです。 何が悪いかが検討つきません。 どうかご教授おねがいします。

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

  • ベストアンサー
回答No.3

整数として扱うと、大きい数ではオーバーフローしてしまうので、 $aaa2 = sprintf("%012s",$aaa); のようにすればよいです。

titikun00
質問者

お礼

非常にわかりやすい回答で感謝しております。 ばっちりうまくいきました。

その他の回答 (2)

  • mtfoggy
  • ベストアンサー率14% (37/255)
回答No.2

>何が悪いかが検討つきません。 浮動小数点を使うか、無限多倍長整数(Math::BigInt)を使ってください。 test.pl #!/usr/bin/perl $aaa = 6120900000; $aaa2 = sprintf("%012.0f", $aaa); print $aaa, "\n"; print $aaa2, "\n"; $ ./test.pl 6120900000 006120900000

titikun00
質問者

お礼

ありがとうございます。 なるほど。 うまくいきました。 感謝します。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

sprintf関数の仕様のようです。 変数としては10桁以上もてるようですが、sprintf関数では10桁以上は表示できません。 回避策として、分割する手があります。 例: #!/usr/local/bin/perl #どこまで表示出来るか実験 print "%012ddの実験\n"; $a = 1; for($i = 1; $i < 12; $i++){ printf("%012d\n",$a); $a = $a * 10 +1; } print "%012luの実験\n"; $a = 1; for($i = 1; $i < 12; $i++){ printf("%012lu\n",$a); $a = $a * 10 +1; } #回避策 print "回避策\n"; $aaa = 6120900000; $aaa2 = sprintf("%06d",int($aaa / 1000000)).sprintf("%06d",$aaa % 1000000); print $aaa2;

titikun00
質問者

お礼

お早い回答ありがとうございます。 なるほどそのような仕様なのですね。 参考になりました。

関連するQ&A