learn-ruby-in-kansai:90
From: "mbaba" <xml@t...>
Date: Fri, 3 Dec 2004 21:10:33 +0900
Subject: [learn-ruby-in-kansai:90] Re: 3桁コンマ
馬場@大阪です 高木さん、お世話になります。 > > こんな風に書いてみたら、理解の助けになりますかね? > gsub を使わないでsubで置換をloop 実行してみます。 > > int_s = "12345678901 > while int_s.sub!(/(\d)(?=\d{3}+$)/, '\\1,') do > printf("before : \"%s\"\n", $`) > printf("matched : \"%s\"\n", $&) > printf("after : \"%s\"\n", $') > printf("substituted: \"%s\"\n", int_s) > puts > end > > 実行すると > > before : "1" > matched : "2" > after : "345678901" > substituted: "12,345678901" > > before : "12,34" > matched : "5" > after : "678901" > substituted: "12,345,678901" > > before : "12,345,67" > matched : "8" > after : "901" > substituted: "12,345,678,901" > > 最初にmatch しているのは、 > "2"とその右となりの隙間(幅を持たないマッチ)になります。 > (?=pattern)は、 > 先行先読み(lookahead assertion)と呼ばれるマッチングで > $ や^ のように幅を持ちません。 よくわかりました^^; (?=pattern)の部分はマッチの条件には入るけれども、 マッチした文字列としては取り扱われず、そこまで、マッチ開始位置が 動かない、、というイメージですよね?(うまくいえませんが^^;) 9桁の場合もやってみて、なるほど、とおもいました。 > このやり方がいちばん直感的にピンとこないですねー、わたしには。 > > sub put_comma { > my $num = $_[0]; > $num = reverse $num; > $num =~ s/(\d{3})(?=\d)(?!\d*\.)/$1,/g; > $num = reverse $num; > return $num > } > > 隙間の連続使いで頭のパイプラインが一瞬stall します :-( URLは(?=pattern)の説明がわりにわかりやすいかなーとおもって 掲載しました。(色分けされたりすると弱い^^;) プログラム的には(?=pattern)が分かればレシピの方がずっと わかりやすいですね。 小波せんせー > PS:「小波先生」はやめてほしいなあ。軽く「小波せんせ」ぐらいが許 > 容限度です,はい。 はい、よろしくお願いします。 > 今日の午後,土曜日の勉強会に顔を出した3年の学生(一番後ろにいた > おとなしい学生)に聞いてみたら,資料を出して議論していたのはよく > わかってそれなりに勉強になったそうです。後の脱線談義は???? やっぱり資料があると、考えも集中しやすいですね。 問題となったとこ以外にも、いろいろとコードの勉強になって助かりました。 馬場幹彦 -- ML: learn-ruby-in-kansai@r... 使い方: http://QuickML.com/
81 2004-11-27 17:29 [babie7a0@y... ] お疲れさま、サマリー作りましょう 82 2004-11-28 14:33 ┗[xml@t... ] 83 2004-11-28 15:53 ┣[xml@t... ] テキストの整形 84 2004-11-28 16:08 ┃┣[xml@t... ] 3桁コンマ 89 2004-12-02 10:39 ┃┃┗[gollum@h... ] -> 90 2004-12-03 13:10 ┃┃ ┗[xml@t... ] 96 2004-12-03 17:22 ┃┗[babie7a0@y... ] 98 2004-12-03 18:32 ┃ ┣[nov@y... ] 99 2004-12-03 23:46 ┃ ┗[konami@k... ] 85 2004-11-29 03:25 ┗[sakai-n@m... ]