• ベストアンサー

『数字の3桁毎にカンマを付ける』に関して

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

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

  • ベストアンサー
  • tokebi
  • ベストアンサー率100% (1/1)
回答No.4

入力ファイルが  テスト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); とすればいいのでは?

naka225
質問者

お礼

tokebi 様。お世話になっております。 戴いたソースをそのまま使ってみると上手くいくのは 確認できます。私が作ったCGIにもいくつかは適用 出来ました。何となくは理解できたのですが、データ をテーブルに流して表示させている場合はやはり出来 なかったです… でも3桁毎にカンマを入れる手法の質問としては解決 なのでここは一旦閉じさせて戴きます。 大変参考になりました。本当にありがとう御座います。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>扱い方がわかりませんでした ,区切りのフィールドを切り出したあと、 $colに数値が入っているのが判っているとしたら $col=commify($col); とすれば、$colにカンマ区切りの文字列が入ります。 sub commify { … } の部分は、どこか邪魔にならない場所(スクリプトの最後とか)にでも置いておけばいいです。

naka225
質問者

お礼

BLUEPIXY 様。お世話になっております。 おかげ様で仕組みは何となく分かったのですが、 下で返答した様にテーブルがどうも… また改めて質問はさせていただこうかと思います。 取り合えず一旦は解決ということで閉じます。 本当に何度もありがとう御座いました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

naka225
質問者

お礼

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

naka225
質問者

補足

ここで追記の質問をします。 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桁ごとにカンマ は入るようです。 何かご教授いただければ・・・・お願い致します。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

クックブックに載っていたものを転載しておきます $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桁ずつ区切って、カンマを挿入して、また逆にして戻す、のが簡単です。 上記の方法では小数点にも対応しています。

naka225
質問者

お礼

BLUEPIXY 様。お返事ありがとう御座います。 先ほどの方と同様扱い方がわかりませんでした。すみません・・・・

すると、全ての回答が全文表示されます。
  • tokebi
  • ベストアンサー率100% (1/1)
回答No.1

実際に私が使っている関数です。 $CommajExpPerHour = '1000' ; &commas ( *CommajExpPerHour ) ; print $CommajExpPerHour."\n"; sub commas { local( *n ) = @_; while ( $n =~s!(.*\d)(\d\d\d)!$1,$2! ) { ; } }

naka225
質問者

お礼

tokebi 様。お返事ありがとう御座います。 ですが扱い方がよくわかりませんでした・・・

すると、全ての回答が全文表示されます。

関連するQ&A