自分の通っていた小学校のあるある

こんにちわ!NAKANOです。

タイトルの事なのですが、検索エンジンで調べて
殆ど回答らしき事はかいてあるのですが、解らない
事が結構あるので掲載させて頂きます。

まず環境は数行あるCSVのデータから一部の行だけを
引っ張ってテーブルに流す方法までは行き着きました。
で、そのテーブル表示させた値はさまざまで項目毎に
「<TD>」で分けております。一番右端が数字なのですが、
これに「3桁毎のカンマ」を付けたいのですが、色んな
サイトで紹介されている手法を参考にやってみたのですが
どうにも上手くいかなくて…(汗)
それでここに質問させて頂いた次第で御座います。
最終的に『1,234,567,890』って感じになれたらな~
って思っています。

宜しくおねがいいたします。

A 回答 (5件)

入力ファイルが


 テスト1,テスト2,テスト3,テスト4,123456789.01
とした場合ですと

open(DATA, "test.csv");
while(<DATA>) {
s/[\r\n]*$//;
@cols = split(/,/);
foreach $col (@cols) {
$col =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; # ここでカンマクギリ(BLUEPIXY様の小数点対応版をしよう)
print "[$col]";
}
print "\n";
}
close(DATA);

とすればいいかとおもいますが?
もしかしてですが
 テスト1,テスト2,テスト3,テスト4,123,456,789.01
こうなってるとか?
だとしたら、項目数がわかってることが前提になりますが、
open(DATA, "test.csv");
while(<DATA>) {
s/[\r\n]*$//;
@cols = split(/,/, $_, 5); # ','で5個まで分けてそれ以降は分けない
foreach $col (@cols) {
print "[$col]";
}
print "\n";
}
close(DATA);

とすればいいのでは?
    • good
    • 0
この回答へのお礼

tokebi 様。お世話になっております。

戴いたソースをそのまま使ってみると上手くいくのは
確認できます。私が作ったCGIにもいくつかは適用
出来ました。何となくは理解できたのですが、データ
をテーブルに流して表示させている場合はやはり出来
なかったです…

でも3桁毎にカンマを入れる手法の質問としては解決
なのでここは一旦閉じさせて戴きます。
大変参考になりました。本当にありがとう御座います。

お礼日時:2005/03/30 17:13

>扱い方がわかりませんでした


,区切りのフィールドを切り出したあと、
$colに数値が入っているのが判っているとしたら
$col=commify($col);
とすれば、$colにカンマ区切りの文字列が入ります。
sub commify {

}
の部分は、どこか邪魔にならない場所(スクリプトの最後とか)にでも置いておけばいいです。
    • good
    • 0
この回答へのお礼

BLUEPIXY 様。お世話になっております。

おかげ様で仕組みは何となく分かったのですが、
下で返答した様にテーブルがどうも…

また改めて質問はさせていただこうかと思います。
取り合えず一旦は解決ということで閉じます。

本当に何度もありがとう御座いました。

お礼日時:2005/03/30 17:15

1 while $text =~ s/(.*\d)(\d\d\d)/$1,$2/;


とか?

この回答への補足

ここで追記の質問をします。


CSVを読んでテーブルに流す仕組みのCGIファイルを
Perlで作ったのですが、このCGIファイルに組込む
んですよね?Perlファイルで作っても上手くいきませ
んでした。ひょっとしてCSVでは出来ない?のかなぁ…

私が使っているソースは以下のものが基本形になっています。

open(DATA, "test.csv");
while(<DATA>) {
s/[\r\n]*$//;
@cols = split(/,/);
foreach $col (@cols) {
print "[$col]";}
print "\n";}
close(DATA);


因みに『split(/,/);』を使わなければ3桁ごとにカンマ
は入るようです。

何かご教授いただければ・・・・お願い致します。

補足日時:2005/03/26 13:25
    • good
    • 0
この回答へのお礼

Tacosan 様。お返事ありがとう御座います。

先にお返事いただきました方のと同様、扱いがわかりませんでした。すいません・・・

お礼日時:2005/03/26 12:50

クックブックに載っていたものを転載しておきます


$num=1234567.89;
$commaNum=commify($num);
print "$commaNum\n";

sub commify { #クックブック 2.16(P103)
my $text = reverse $_[0];
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
return scalar reverse $text;
}

基本的なアイデアは逆にしてから3桁ずつ区切って、カンマを挿入して、また逆にして戻す、のが簡単です。
上記の方法では小数点にも対応しています。
    • good
    • 0
この回答へのお礼

BLUEPIXY 様。お返事ありがとう御座います。

先ほどの方と同様扱い方がわかりませんでした。すみません・・・・

お礼日時:2005/03/26 12:49

実際に私が使っている関数です。



$CommajExpPerHour = '1000' ;
&commas ( *CommajExpPerHour ) ;
print $CommajExpPerHour."\n";

sub commas {
local( *n ) = @_;
while ( $n =~s!(.*\d)(\d\d\d)!$1,$2! ) { ; }
}
    • good
    • 0
この回答へのお礼

tokebi 様。お返事ありがとう御座います。

ですが扱い方がよくわかりませんでした・・・

お礼日時:2005/03/26 12:48

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


おすすめ情報