end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

perlの正規表現で数値(整数)を3桁毎に区切る

1000→1,000のように数値を3桁毎に区切るには、正規表現「s/([+-]?\d+)(\d\d\d)/$1,$2/go」を使用しています。

#!/usr/local/bin/perl
use strict;
use warnings;

my @test_vals = (-10000,-1000,-100,-10,-1,0,
		 1,10,100,1000,10000,
		 1234567.12345,1000.000001);

for my $org_val ( @test_vals ){

    my $int_val = "";	#整数部分
    my $deci_val = "";	#小数部分
    if ( $org_val =~ /([+-]?\d+)(\.?\d*)/){
	$int_val = $1;
	$deci_val = $2;
    } else {
	$int_val = $org_val;
    }

    #整数部分を3桁毎に区切る
    $int_val =~ s/([+-]?\d)(?=(\d{3})+(?!\d))/$1,/go;
    my $split_val = $int_val . $deci_val;

    print sprintf("%20s -> %20s","($org_val)","($split_val)"),"\n";
}

実行結果

$ ./foo.pl 
            (-10000) ->            (-10,000)
             (-1000) ->             (-1,000)
              (-100) ->               (-100)
               (-10) ->                (-10)
                (-1) ->                 (-1)
                 (0) ->                  (0)
                 (1) ->                  (1)
                (10) ->                 (10)
               (100) ->                (100)
              (1000) ->              (1,000)
             (10000) ->             (10,000)
     (1234567.12345) ->    (1,234,567.12345)
       (1000.000001) ->       (1,000.000001)

http://d.hatena.ne.jp/end0tknr/20080901/1220272146
以前、Regexp::Common::numberによる数値書式のチェックも紹介していますが、この記事も参考になるかもしれません。