• ベストアンサー

Perlでの数字の12桁化

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

  • CGI
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答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

  • 半角数字を全角数字で検索できるのはなぜ?

    MYSQLの検索について テーブルAAAのitemには半角の「0000」が入っています。 しかし、下記のSQLを実行すると検索されます。 なぜ全角文字を半角として処理するのでしょうか? 検索しないようにするには、どう対処すればよろしいのでしょうか? テーブル構成 TABLE名:AAA id int(11); item varchar(4) utf-8 -> '0000' SQL文 SELECT * FROM AAA WHERE item = '0000'

  • cshの文字列操作(0埋め)

    ヤマトです。 cshの文字列操作について質問します。 環境はRed Had Linux7.2です。 数値を文字列に変換し、更に0埋めするのはどのようにしたら良いのでしょうか? 以下に例を書きます。 ====SAMPLE.sh(一部抜粋)==== @ NUM_AAA = 1 ECHO NUM_AAA set CHR_AAA = ××××× ECHO CHR_AAA ====SAMPLE.sh(実行結果)==== 1 01 以上の ××××× に当てはまる処理が分かりません。 C言語とかで言うなら、sprintf のような処理をしたいのですが。 どのようにしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • perlプログラムについて

    前回の質問で補足すればよかったのですが,ミスしてしまったので^^; 同じような質問ですがもう一度・・・ (プログラム初心者です) 「もし,aaaという文字列が2個以上存在する時は,最初のaaaを使う」 を, perl で書きたいと思っております.書いてみたものは以下です. ----------- if (aaa >=2) { 最初のaaaを使う } ----------- いろいろと間違えてそうですが... 「最初のaaaを使う」 という表現がわかりません>< 間違い・こうしたほうがいいよ などありましたら御願いします!

    • ベストアンサー
    • Perl
  • perlの ¥033 不具合エラー

    以下のスクリプトを実行すると"Unrecognized character \033 at ./tools/aaa.pl line 5."というエラーが出てしまいます。やりたいことは 文中の "//! aaa"を全て削除して出力するというものです。何が悪いのでしょうか? ----------------- #! /usr/bin/perl while(<>){ if(m#//\s*\!.*#){ $_ =~ s#//\s*\!.*\n##; print "AAA: $_\n"; }else{ print $_; } } -------------- 以上、宜しくお願い致します。

  • perlのマクロ演算子?について

    AAA変数にBBB配列名を代入し,AAA変数に配列を入れてBBB配列を使いたいのですが....どのようにするのでしょうか? 例 $count = 1 $AAA = "@BBB_no".$count; ※$AAA = ("ア","イ","ウ","エ"); ↑ここの※の部分に何か加えるのでしょうか?

  • perl について

    http://AAA/BBB/???/CCC AAAとCCCは固定文字です。 BBBは変化します。 ///の数・順番も固定です。 この状態で、「???」を抜き出してZZZ変数に値を代入するにはどうすれば良いでしょうか? ZZZ=

    • ベストアンサー
    • Perl
  • perlのエラー処理

    ライブラリ内部で発生したエラーをキャッチする方法がわかりません(>_<) ---------------------------------- #!/usr/bin/perl use XML::AAA; my $aaa = "bbb"; my $ccc = XML::AAA->new($aaa); ---------------------------------- こんなスクリプトを書いたとします。 XML::AAAが、newするときにXML::BBBを使っているとします。 引数が不正でXML::BBBでエラーが発生したときに どうやってそのエラーをキャッチしたらいいかわかりません。 eval{my $ccc = XML::AAA->new($aaa);} if($@){&error_handling;} とやってみても、うまくキャッチできません。 また、$aaaが正しい引数かどうかを確認するのは、ちょっと難しいので、やはり、エラーをキャッチする方向で考えたいです。 ほかにどのような方法があるか教えてください。。

  • バッチファイル

    お世話になります。 バッチファイルを用いて、実行されるプログラムがあります。 私の作成したものではないので、どのようなやり取りが内部で行われているのかは、詳細はわかりません。 例えば、D:\Programフォルダーの中にプルグラムをインストールしたとすれば、引数を2つ指定して(例:aaaとbbb)、バッチファイル(test.bat)を以下のように実行すれば、プログラムは正常に作動します。 D:\Program>test aaa bbb しかし、以下の場合には、正常に作動しません。 C:\>D:\Program>test aaa bbb つまり、パスを含めて、バッチファイルを実行することは、このプログラムは許可してくれません。 ここで、例えば、VBなどを用いて、テキストボックスなどで引数を二つ指定して、実行ボタンをクリックすれば、必ず、D:\Program>test aaa bbbという状態で、バッチファイルが実行されるようにするには、どのようにすればよろしいでしょうか? もしご存知の方がいらっしゃいましたら、是非、ご教授願います。 以上、宜しくお願いいたします。

  • 文字列の ' aaa"bbbccc"ddd' から"で囲まれた部分を抜き出したい

    こんにちは。 タイトルの通りなのですが $test = 'aaa="bbbccc"ddd'; のbbbcccだけを抜き出したいので、 if ($test =~ /aaa=\"(.+)\"/) { $test= $1; } と正規表現を利用して実行してみましたがうまく動作しません。 確定してるのは aaa="この間の文字列"の形で、 aaa=ダブルコーテーション ダブルコーテーション は固定なのです。 そのようにな文字列から特定の個所を抜き出すように実装するには どのようにすればよろしいのでしょうか? どなたかご存知の方、よろしくご教授ください。

    • ベストアンサー
    • Perl
  • 0で上の桁をうめる方法

    $no = 1; $total = sprintf("%4d",$no);#total=1; としたときに、 $totalの値は当然1になりますが、これを $totalの値が0001になるようにする『シンプル』でいい方法は無いでしょうか。都合により、sprintf関数は除外しかねます。でも除外した方法でもいいです。 if文で、 $noが一桁のときは、$total = "000" . "$no"; $noが2桁のときは… という方法以外でお願いします。なぜかというと、%5d とか%7dとかしたときにも対応できるようにしたいからです。それと当然$noの値が111であれば、%4dであれば、$totalの値は0111です。 すこしわがままですが、よろしくお願いします。

    • ベストアンサー
    • CGI