是否在某个(小)模块中隐藏了一个函数,它为我做了这个:
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 );
答案 0 :(得分:4)
最快的方法是perlfaq
(perldoc -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。它有commify
和group_digits
方法。