Есть ли функция, которая делает группировку чисел (тысяч)? - PullRequest
3 голосов
/ 09 марта 2012

Где-то в (маленьком) модуле спрятана функция, которая делает это для меня:

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 ]

4 голосов
/ 09 марта 2012

Самый быстрый метод в 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 для выполнения поверхностной работы. Замена для каждого из них, кажется, немного больше, чем необходимо.

3 голосов
/ 09 марта 2012

Я использую

$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 голосов
/ 09 марта 2012

Посмотрите на perl5i . Имеет методы commify и group_digits.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...