0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl6 Cookbook 数値に位取りのcommaを挿入する

Last updated at Posted at 2015-11-18

数字の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

おわりです。

参考や注釈

  1. カンマとかコンマとか読まれますが発音は[kɑ́mə]です。やめて、私のために争わないで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?