Rubyのプログラムで金額表記をしたいと思います。
例: 1234567890 > \1,234,567,890
前回同様、以下の要領でお願いします。
◎この質問は、プログラムの書き方がわからないのではなく「こんな書き方もできる」の募集です。
◎面白いプログラム、とても短いプログラム、トリッキーなもや勉強になるものは喜ばしいです。
◎このプログラムが役立つ場面は想像できません :-P
◎Rubyがダメな人はRuby以外でも可
1回目、2回目を拝見させていただきましたが、回答者の皆さんの創意工夫がある書き方が楽しいですね。
プログラミング勉強中ということで参加させてください。
(私はRubyは勉強不足なのでPHPで書きます。)
PHPにはmoney_format関数というのがあるようですが、Cのライブラリ関数のstrfmonが使える環境でないと動かないです…。
稼動確認できませんでした。
<?php $str_before = '1234567890'; setlocale(LC_MONETARY,'japanese'); print money_format('%n', $str_before); ?>
number_formatで千位毎にカンマを出力させるのが一番簡単じゃないでしょうか。
<?php $str_before = '1234567890'; print "\\" . number_format($str_before); ?>
仕方がないので無理やり力技で書いてみましたが、無駄にコードが長くなってしまいました。
ホントに意味がないですね…。
<?php $str_before = '1234567890'; if (strlen($str_before)!=0) { // 文字列が3で割り切れない場合、文字列先頭の余り分を配列にセット $str_mod = strlen($str_before)%3; if ($str_mod != 0) { $str_array[] = substr($str_before,0,$str_mod); $str_before = substr($str_before, $str_mod, strlen($str_before)); } // 文字列を3文字分ずつ区切って配列にセット for ($i=0;$i<strlen($str_before);$i+=3) { $str_array[] = substr($str_before, $i, 3); } // 配列の値を先頭から抜き出し、シングルクォートを追加 // 配列の最後の値の後にはシングルクォートが不要なので処理を分ける print '\\'; while (count($str_array)>1) { print array_shift($str_array); print ","; } print array_shift($str_array); } ?>
ダラダラと書きましたが、なんだかとてもつまらない物になってしまいました。
Rubyistの方の回答に期待したいと思います。
(踏み台にでもなれたら本望です。)
http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/...
から引用しますと
s = '1234567890'
while s.sub!(/^(\d+)(\d{3}(?:,\d{3})*)$/, '\1,\2') do end
puts '\\' + s
や
puts '\\' + '1234567890'.reverse.gsub(/(\d{3})(?=\d)/,'\1,').reverse
という書き方があるようです。
ありがとうございます
ohzakiさんのページ、正規表現関連では以前からお世話になってます。参考になりますね。
これも紹介されていたとは。
ありがとうございます
PHPはあまり使って無いのでわからないんですが、数字から文字列を作る場合は単に文字列に変換する関数があるのですかね?