- ベストアンサー
Perlでの数字の12桁化
$aaa = 6120900000; $aaa2 = sprintf("%12d",$aaa); とするとなぜか$aaa2 は-000000000001 となってしまうのです。 006120900000となってほしいのですが希望どおりに実行されないのです。 何が悪いかが検討つきません。 どうかご教授おねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
整数として扱うと、大きい数ではオーバーフローしてしまうので、 $aaa2 = sprintf("%012s",$aaa); のようにすればよいです。
その他の回答 (2)
- mtfoggy
- ベストアンサー率14% (37/255)
>何が悪いかが検討つきません。 浮動小数点を使うか、無限多倍長整数(Math::BigInt)を使ってください。 test.pl #!/usr/bin/perl $aaa = 6120900000; $aaa2 = sprintf("%012.0f", $aaa); print $aaa, "\n"; print $aaa2, "\n"; $ ./test.pl 6120900000 006120900000
お礼
ありがとうございます。 なるほど。 うまくいきました。 感謝します。
- venzou
- ベストアンサー率71% (311/435)
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;
お礼
お早い回答ありがとうございます。 なるほどそのような仕様なのですね。 参考になりました。
お礼
非常にわかりやすい回答で感謝しております。 ばっちりうまくいきました。