桁数を揃えるには?

[上に] [前に] [次に]
がんま [E-Mail] 1998/09/08(火) 23:35:21
また、ちょっと質問させて頂きます。

例えばデータファイルの中に

123
72
5
234

とこのように、一行ずつの数値が入っていたとします。
これを綺麗に「3桁」にして並べようと思っているのです。

元々3桁になっているのは、そのまま表示されるとして
72と5を「072」「005」と、このように
足りない桁は「0」を入れるようにして表示したいのです。

open(IN,'number.dat');
$bbb = <IN>;
close(IN);

@aa = split(//,$bbb);

while ($#aa < 3) {@aa = (0,@aa);}

foreach $min (@aa) {print "$min";}

このように、書籍などを参考にして組んで見たのですが
どうもこのプログラムでは反応せず
「000」と表示されるだけになってしまいます。

このことで、何か良い方法がありましたら
教えて下さい。 よろしくお願いします。

とほほ 1998/09/09(水) 00:53:33
printf("%03d", $bbb)ですね。(^_^)

mm 1998/09/09(水) 01:00:35
普通は、close(IN); の後で、
printf( "%03d", $bbb );
とすると思います。

ところで、元のスクリプトは、
while ($#aa < 2) {@aa = (0,@aa);}
としてもダメですか?

mm 1998/09/09(水) 01:01:47
ありゃ、すいません、またやってしまいました(^^;
しかも、7分くらいのタイムラグがありますね(^^;;;;

がんま [E-Mail] 1998/09/09(水) 12:05:53
とほほさん、mmさん、ご返答ありがとうございました。
あの一文を入れたら、3桁で表示ができました。

>while ($#aa < 2) {@aa = (0,@aa);}

そのようにしても、二桁になるだけで、特に他に変化は見られませんでした。

教えて頂いた一文を入れたのですが
これ一桁の場合は良いのですが、二桁や三桁の場合
先頭の一桁だけ認識してしまいます。

open(IN, 'number.dat');
@bbb = <IN>;

foreach $min (@bbb) {
($aaa) = split(//, $min);

printf ("%03d", $aaa);
print "\n";
}

close(IN);

このプログラムを使ってみると

123
72

という場合、「001」「007」となってしまいます。

「printf」は、いじりようが無いみたいで
昨日書いた「while」文などを使っても、うまく組むことが出来ませんでした。

度々すみませんが、良い方法がありましたら
ご返答をお願いします。

がんま [E-Mail] 1998/09/09(水) 14:52:56
解決しました(^^

($aaa) = split(//, $min);を外して

printf ("%03d", $aaa);を
printf ("%03d", $min);に変更したら
左に0が並んで、3桁表示が出来ました。

いろいろとありがとうございました。

がんま 1998/09/09(水) 19:38:32
まだ、ちょっと、聞きたいことがあります。

例えばフォームから入力された数値に対して
足りない桁数の場合に「0」を付けたい場合に
どう表記すれば良いのか、教えて頂きたいのです。

$sec = ("%02d", $sec);

と言うような、表記は有り得るでしょうか?
上記の問題に対して、これをやってみたのですが
全く無反応でして・・・。

「if」に組み込んで見ても
表記されないか、めちゃくちゃな文字が表示されるだけでした。

このことで、出来ましたらご返答をお願いします。

解決したと思ったのに・・・何か解決すると別な問題が発生する。
これがプログラムなのか・・・う〜ん。

mm 1998/09/09(水) 21:13:42
$sec = sprintf("%02d", $sec);
では?

mm 1998/09/09(水) 22:19:29
>>while ($#aa < 2) {@aa = (0,@aa);}
>そのようにしても、二桁になるだけで、特に他に変化は見られませんでした。

なんで? と思ったら、改行がくっついていたんですね。
@bbb = <IN>; した後は、chop @bbb; しておきましょう。

がんま 1998/09/10(木) 00:00:56
[[解決]]
mmさん、いろいろとありがとうございます。
お蔭様で、私の考えていた形にすることが出来ました。

>@bbb = <IN>; した後は、chop @bbb; しておきましょう。

これは、まだ成功していません。
多分、私の組み方に問題があると思うので
もう少しいろいろ試してみます。

本当に、ありがとうございました(^^

mm 1998/09/10(木) 00:54:22
あっ、chop は考え方の問題で、プログラムとしては、
必ずchop が必要であるということではありませんです。

がんま 1998/09/10(木) 02:22:07
>必ずchop が必要であるということではありませんです。

そうなんですか。
さっきも試したのですが、何故か実行されなかったのです。

正直言って、私はプログラムの組み方が理解出来ていないので(涙)

継続は力なりの言葉を胸に、がんばろ。

[上に] [前に] [次に]