是否有一个功能可以对数字进行分组(千)?

时间:2012-03-09 13:21:36

标签: perl module numbers grouping

是否在某个(小)模块中隐藏了一个函数,它为我做了这个:

my $var = 23654325432;
$var = reverse $var;
$var =~ s/\d{3}\K(?=\d+)/_/g;
$var = reverse $var;

我喜欢Number::Format,但它没有通过Windows上的所有测试。

use Number::Format;
my $nf = new Number::Format( 
    -thousands_sep   => ',',
    -decimal_point   => '.',
);

my $formatted = $nf->format_number( 23142153 );

3 个答案:

答案 0 :(得分:4)

最快的方法是perlfaqperldoc -q commas):

sub commify {
    local $_ = shift;
    1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
    return $_;
}

当然,我刚刚想出了一个比这个要好70%的功能。

use constant THOU_SEP => ',';
use English qw<@LAST_MATCH_START @LAST_MATCH_END>;
sub ss_commify { 
    my $s = shift;
    return $s unless $s =~ m/\d{4,}/;
    my ( $f, $p ) = ( $LAST_MATCH_START[0], $LAST_MATCH_END[0] );
    my $ts = THOU_SEP;
    # |-- That is, replace a *0-length* substring at $p with the 
    # v   thousand separator
    substr( $s, $p, 0, $ts ) while ( $p -= 3 ) > $f; 
    return $s;
}

它适用于你前面或后面的任何文字。 FAQ版本只适用于后面的文本(不可否认,它是Perl中的数字值)。

想法是找到你想要使用正则表达式一次的工作,然后简单地使用Perl的弹性字符串实现来做敷衍工作。对这些中的每一个的替换似乎比必要的开销更多。

答案 1 :(得分:3)

我用

$num =~ s/(\d) (?= (?:\d{3})+ \b )/$1,/gx;

只是在每个数字之后添加一个逗号,后跟三位数的倍数。

如果你想要一个功能:

sub commify {
  (my $num = $_[0]) =~ s/(\d) (?= (?:\d{3})+ \b )/$1,/gx;
  $num;
}

print commify(10 ** $_), "\n" for 1 .. 14;

<强>输出

10
100
1,000
10,000
100,000
1,000,000
10,000,000
100,000,000
1,000,000,000
10,000,000,000
100,000,000,000
1,000,000,000,000
10,000,000,000,000
100,000,000,000,000

答案 2 :(得分:2)

看看perl5i。它有commifygroup_digits方法。