アプリ版:「スタンプのみでお礼する」機能のリリースについて

$aaa = 6120900000;
$aaa2 = sprintf("%12d",$aaa);

とするとなぜか$aaa2 は-000000000001 となってしまうのです。
006120900000となってほしいのですが希望どおりに実行されないのです。
何が悪いかが検討つきません。
どうかご教授おねがいします。

A 回答 (3件)

整数として扱うと、大きい数ではオーバーフローしてしまうので、


$aaa2 = sprintf("%012s",$aaa);
のようにすればよいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 23:37

>何が悪いかが検討つきません。



浮動小数点を使うか、無限多倍長整数(Math::BigInt)を使ってください。


test.pl

#!/usr/bin/perl

$aaa = 6120900000;
$aaa2 = sprintf("%012.0f", $aaa);

print $aaa, "\n";
print $aaa2, "\n";


$ ./test.pl
6120900000
006120900000
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 23:36

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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/09 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!