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


Автор: dimpv 25.5.2010, 21:25
Добрый день! Для различной бухгалтерской отчетности пишу функцию преобразования числа в строку по формату, типа -1234567.67 -> 1,234,567.67- или -000,000,001,234,567.67, например zzz,zzz,zzz,zzz,zzz,zzz.zz или >>>,>>>,>>>,>>>,>>z.zz  ну и т.д., т.к. штатный sprintf представляется ограниченным, а write пишет непосредственно в файл, да и просто хочется написать свой механизм с возможностью его доработки по запросу, формат задается параметром. Столкнулся с тем, что число в Perl может буть представленно по разному, например 100.00 или 1е+2, мне же надо из любого числа в формате Perl получить вариант без экспоненты в виде строки, дабы потом уже разобрать ее и напечатать по формату, ну например 30е-5 преобразуется в 0.0003, а 30е+5 в 3000000 и т.д. с определенный точностью - количеством знаков в дробной части, кто-нибудь делал такое ?

Автор: ramus 25.5.2010, 21:58
Уважаемый dimpv!
Я не имею опыта по сути вопроса, но отвечая на вопрос
"число в Perl может быть представлено по разному, например 100.00 или 1е+2"
можно воспользоваться sprintf для однозначного перевода в требуемый ИСХОДНЫЙ формат и затем уже по разработанному Вами алгоритму перевести это число в требуемую форму.
Как подсказка - удобнее идти по символам числа справа налево.

Автор: klem4 26.5.2010, 16:19
может вас на истинный путь этот набросок наведет

Код

#!/usr/bin/perl
use strict;

    my @values = qw[ 1 123 12345 1234567 2e+2 ];
    
    for ( @values )
    {
        # преобрзуем к десятичному формату
        my $value = sprintf "%d", $_;
        
        # для удобста дописываем в начало недостающие нули
        $value = '0'.$value while ( length( $value ) % 3 );
        
        my @parts = ( $value =~ /(\d{3})/g );
        
        # елси надо, удаляем незначащие нули в начале
        if ( 1 )
        {
            $parts[0] =~ s/^0+//;
        }
        
        # выводим число ...
        printf "%s\n", join ",", @parts;
        
    }

Автор: amg 27.5.2010, 15:46
Еще один набросок (немного дополненный пример из Perl Cookbook):
Код
print commify(-1234567.67),$/;

sub commify {
  my ($number, $format) = @_;
  $format ||= '%018.2f';
  $format =~ s/([1-9]\d*)/$1+1/e if $number < 0;
  $number = sprintf $format, $number;
  $number = reverse $number;
  $number =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
  return scalar reverse $number;
}

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