Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Разделить тысячи в числах


Автор: cybear 14.7.2006, 11:27
Как бы вы предложили наиболее эффективно добавить во все печатаемые числа разделитель тысяч. То есть выводить в формате 100'000'000.00 USD к примеру ;) 

Автор: cybear 14.7.2006, 13:57
если кому надо еще - вот отличный модуль http://search.cpan.org/~wrw/Number-Format-1.51/Format.pm

насчет эффективности пока неуверен правда 

Автор: korob2001 16.7.2006, 02:08
Я делаю это всегда вручную. Посмотри такой код.
Код
#!/usr/bin/perl
use strict;

my $sum = 10000000000;

sub deel {
    my $num = reverse(shift);
    my $char = shift || ".";
    $num =~ s/(\d{3})/$1$char/g;
    return reverse($num);
}

print "Before: $sum\n";
print "After: " . deel($sum) . "\n";
print "After with second parameter: " . deel($sum,"'") . "\n";
 

Автор: PerlMaster 16.7.2006, 19:00
А у меня такая функция для форматирования чисел.
$decimals - кол-во знаков после запятой (точки)
$separator - разделитель тысяч

Код

sub    format_digits {
    my ($value, $decimals, $separator)=@_;
    my $tmp = sprintf("%0.$decimals"."f", $value);
    if ($tmp=~m/^(\d+?)((?:\d{3})*)(\.\d*?)?$/) {
        my ($prefix, $middle, $float) = ($1,$2,$3);
        $middle=~s/(\d{3})/"$separator$1"/ge;
        return "$prefix$middle$float";
    } else {
        return $tmp;
    }
}

 

Автор: korob2001 17.7.2006, 01:28
Немного подправил твой пример, так как получал предупреждение если число было целым и передавал в качестве второго значения 0, т.е. отказывался от части после десятичтоной точки.
Код

#!/usr/bin/perl

my $num = 1000;

sub format_digits {
    my($value, $decimals, $separator) = @_;
    my $tmp = sprintf("%0.${decimals}f", $value);
    if (my ($prefix, $middle, $float) = $tmp=~m/^(\d+?)((?:\d{3})*)(\.\d*?)?$/) {
        $middle =~ s/(\d{3})/$separator$1/g;
        return $float ? join("",$prefix,$middle,$float) : join("",$prefix,$middle);
    } else {
        return $tmp;
    }
}

print format_digits($num,0,',');

PS: Сейчас вроде верно работает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)