数字の3桁ごとに区切りのcomma1を入れましょう。
Perl6の環境構築についてはこちら。
Perl6導入とHello, world! - Qiita
Perl5
use v5.18;
## Perl Cookbook では以下のように書いてありました。
# sub commify {
# my $text = reverse $_[0];
# $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
# return scalar reverse $text;
# }
sub commify ($) {
return ''.reverse # 最後にもう一度反転。
( # リストコンテキストとして評価されないように空文字と結合。
(reverse $_[0]) =~ s{ # さて、入力文字列をひっくり返したものを正規表現で置換していきます。
(\d\d\d)(?=\d) # \d は 0から9 を表していて、?= は先読み表明です。
# つまり、先に\dが来る3連続の\dを記録します。
(?!\d*\.) # ?! は先読み否定。小数点以下は無視なのです。
}
{$1,}xgr # 記録した3連続の\dのあとにcomma(,)を挿入します。
); # x: 正規表現の途中に↑のようにコメント入れる
# g: 文字列の中で可能な限り繰り返し
# r: 非破壊置換。元の文字列はそのままで置換後の文字列を返す。
}
say commify 1234.5678; #=> 1,234.5678
say commify 42.195; #=> 42.195
say commify -65536; #=> -65,536
say commify -2880.11; #=> -2,880.11
Perl6
use v6;
sub commify($s) {
return $s.subst:
/<[1..9]><[0..9]>+/,
*.flip.comb(/<{ '.**1..3' }>/).join(',').flip;
}
say commify 1234.5678; #=> 1,234.5678
say commify 42.195; #=> 42.195
say commify -65536; #=> -65,536
say commify -2880.11; #=> -2,880.11
おわりです。
参考や注釈
- 2.17. Putting Commas in Numbers
- perlreref - Perl の正規表現のリファレンス
- Perl6 Regexes
- General quantifier: ** min..max
- Perl6 class Str
- Commatizing numbers - Rosetta Code
-
カンマとかコンマとか読まれますが発音は
[kɑ́mə]
です。やめて、私のために争わないで↩