Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Числовые значения в Perl, Пытаюсь написать функцию преобразования 
:(
    Опции темы
dimpv
Дата 25.5.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 25.5.2010

Репутация: нет
Всего: нет



Добрый день! Для различной бухгалтерской отчетности пишу функцию преобразования числа в строку по формату, типа -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 и т.д. с определенный точностью - количеством знаков в дробной части, кто-нибудь делал такое ?
PM MAIL   Вверх
ramus
Дата 25.5.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 21.2.2008

Репутация: 1
Всего: 1



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

PM MAIL   Вверх
klem4
Дата 26.5.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



может вас на истинный путь этот набросок наведет

Код

#!/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;
        
    }

PM MAIL   Вверх
amg
Дата 27.5.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Еще один набросок (немного дополненный пример из 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;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.