:: Игры Разума
Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Как-то, с полгода назад кажется, подправлял по мелочам одну из задач и захотелось попробовать встроить функцию, выводящую сумму прописью - непосредственно в сам report, вставив ее в Init окружения рипорта (в принципе на форуме про это рассказывал), все вроде бы и вышло неплохо, разве что функция получилась как бы "одноразовая", т.е. если скажем для печати платежки это отлично подходит, то в общем случае - использовать ее, например для вывода где-то в итогах группы, разумеется уже никак не получится.
На днях же попутно со всякой текучкой начал делать задачку совсем иного рода, где как раз бы и нужен был бы вывод именно в итогах группы.
В принципе ну можно конечно поступить классически обычным образом - вызывая процедуру откуда-то из внешнего prg и т.п.
Но как-то оно все уж слишком неинтересно. И, пока время со всем этим терпит, захотелось все-таки немного поизвращаться. В смысле попридумывать и еще какие-то иные варианты. Ну а если уж не получится - так хоть поупражняться с этой небольшой головоломкой, все польза какая-то.
Одно решение, причем похоже вполне реально выполнимое, нащупал довольно-таки быстро, вот только добить там все до конца пока что так и не дали. Хотя думаю, если не будут усиленно мешать, может быть даже завтра оно уже и будет готово.
Но решил все-таки и полюбопыствовать - возможно кто-то или уже решал что-то подобное, или может быть сможет найти какой-то иной, свой, более оптимальный вариант.
Ну в общем суть задачи думаю уже давно понятна - даже и из названия:
- Написать однострочную функцию преобразования числа в строку, представляющую собой его числительное, или же попросту - число прописью.

Пока писал сегодня эту функцию - не раз мелькала мысль: все-таки до чего же разнообразны числительные в русском языке, предоставляя программисту такие уникальные возможности по работе над подобными головоломками, каких наверно не дает ни один другой язык.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я так понимаю, что цель не "функция", а на самом деле ВЫРАЖЕНИЕ переводящее число в "строку прописью". Как мне кажется, вот это решение можно записать в виде одного простого, но весьма и весьма длинного выражения (возможно убрав проверку, отсекающую "слишком крупные суммы", и "допилив" имеющиеся недочёты).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Ну в принципе я с утра уже допилил свое вчерашнее начинание. И как раз таки STRTRAN и использовал, причем немного похожим образом. Хотя тут наверно и трудно что-то другое придумать. В качестве вывода на экран все работает, вот с рипортом правда еще не проверял, тут может размер подвести - уж слишком длинная строка вышла. Сейчас подсчитал - 5600 символов.
Может попробую как-то оптимизировать на досуге. Потому что например при попытке вставить это дело в цикл, когда захотелось визуально убедиться в нормальном виде уже во всем диапазоне "сплошным потоком" (отстраивал по тройкам, там вроде показывало хорошо) - фокс перепугался и начал что-то бормотать про слишком большую глубину вложенности. Где-то вроде есть настройка увеличения глубины, но что-то не охота было лазить - в принципе уверен, что все работает и в полном диапазоне. Поскольку и все тройки, и все переходные моменты проверил.

А все же жаль, что в Windows не предусмотрена встроенная функция для числительных для всех языков существующих локализаций.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Хотя. Посмотрел повнимательнее. Возможно все-таки в решении метод окажется чуть более оптимальным, и строка даже покороче. Может тоже попробую на досуге.

Кстати, там написано, что это "самое короткое решение", но у меня давно уже написано и используется и еще более короткое. ;) К сожалению его "свернуть" в принципе не получится, оно сделано несколько специфически. Т.е. только в многострочном варианте проходит. Хотя как раз от него я и отталкивался при разработке своей строки.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 12.08.11 12:17
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
А с чем связана такая необходимость? Портируемость отчета?


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Ну в общем-то да. Как первоначальный толчок. А затем - еще и просто попытка "поиска доселе неизведанного".


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Goodwin

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
А разве выражение в репорте могёт быть длиннее 254?


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Да судя по дефолтным настройкам нет - в чем лишний раз опять убедился уже с утра, тупо вставив в тайной надежде, а вдруг. Иногда такое все же прокатывает, говорят даже явление индуктивности так было открыто.
И хотя и получил из решения (слегка модифицировав вариант Ромы), как и предполагал в пятницу, уже намного более короткий вариант строки (теперь уже порядка всего лишь 1600 символов), но тем не менее рипорт ее обрезает до своего стандарта. Не знаю есть ли какая-то "расширяющая" установка (никогда не было особой необходимости) - надо будет на всякий случай глянуть по хелпу, но скорее всего этот вариант не прокатит. Как впрочем и можно было предположить.
Есть однако ж и еще одна идея попытаться через переменные. Хотя и допускаю, что все равно кроме получившейся уже этой "самой короткой строки-1600" ничего тут тоже не выйдет. Но вдруг что-то и нащупается.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Yes!Yes!Yes! :bodr: Самое смешное - работает! [sm021] В смысле - элементарное объединение моего первого способа с этой самой, полученной чрез свертывание, "короткой строкой". :beer2:
Есть правда один странный момент, связанный с непонятным преждевременным переполнением при суммировании. Но думаю это все же разрешимо.
Пока что же (для меня по-крайней мере) пожалуй более важен оказался сам факт возможности подобного вычисления внутри рипорта. [sm128]
Особая признательность Игорю - за натолкновение на вариант со все же более оптимизированными заменами, чем как оказалось были в моем первом решении. :beer2:


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 15.08.11 12:46
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Ну все в принципе. Суммирование через встроенную в рипорт наращиваемую переменную окончательно решило все проблемы. Если бы это было бы кому-то еще интересно, оставалось бы только еще оформить - и в решения. Но похоже все это было чисто "сам на сам". Ну попробую все же ради интереса в новом проекте, зря что ли оно было.



------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Goodwin

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
За экспериментаторство - пять.
Но сама идея не очень: функция получится раскопипащенной в стопицот мест,
и для замены в исходниках 'руб.' на 'рублей' прийдётся отдельную громоздкую тулзу писать.
Может лучше положить рядом библиотеку (или доставать и класть её из поля отчёта в рантайме)
и цеплять её в событии репорта?
Или даже не цепляя как библиотеку, запущать процедуру с параметрами:
ExecScript(chrt('n=1000;do libs\libs\code with @n;return n', ';', chr(13))
Хотя это тоже изврат тот ещё.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
Да в принципе даже валюта меняется очень легко, не то что там "'руб.' на 'рублей'". Всего лишь добавляется параметр. Так что результатом пока что доволен. Уже даже прикрутил для пары выводов. А сейчас, обдумывая открывшиеся в связи с преодолением "порога-254" новые возможности, как бы прохожу период, подобный неожиданному попаданию в магазин с кучей всяческой всячины, о существовании которой до этого даже не предполагал.
Т.е. например можно иметь просто готовую болванку рипорта, которая сама будет иметь возможность выводить кучу разной полезной рукописности, и при необходимости ее использовать вместо стандартного пустого макета.
Кстати вчера читая форум по ходу и еще пару идеек похоже придумалось в сходном направлении. Но это надо еще проверять. Да и пока что они как бы не особо и необходимы.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Разные валюты по разному склоняются - так что без влезания "внутрь" хитрого выражения весьма проблематично сделать её универсальной.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Goodwin

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Сразу-то да.
А вот сопровождать/обновлять функции после, в уже готовых репортах, весьма накладно будет.
Да и что это за репорт такой: сам-в-себе?
Всё равно он в каком-то проекте, а в проекте и библотеки есть.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
medstrax
Забанен

Сообщений: 5964
Дата регистрации: 23.03.2007
Клоака в склонениях. Увы
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Эээ. Пардон вроде про сумму прописью давненько все закрыли.
Чуток стесняюсь, надавите - выложу свою (конечно что-то с кем-то).
Род единицы и пр..
Ratings: 0 negative/0 positive
Re: Функция "сумма прописью" - в одну строку
Crispy
Автор

Сообщений: 18571
Дата регистрации: 16.05.2005
При сделанной мной структуре замена валют с их склонениями - становится в принципе вещью довольно элементарной. В разумных пределах разумеется. Ну где-то 2-3 скажем, ну 8-9. Но никак не 15. Хотя при желании можно впихать и 15 возможно. Однако в подобных случаях удобнее все же использовать обычную внешнюю таблицу, подключаемую к любому подходящему для этого стандартному решению по числительным.

Taran
Эээ. Пардон вроде про сумму прописью давненько все закрыли.
Чуток стесняюсь, надавите - выложу свою (конечно что-то с кем-то).
Род единицы и пр..

Так у тебя она что - тоже однострочная? И какой длины это все будет, если в символах? Мой рекорд (на основе функции Ромы из решения по ссылке Игоря) - пока что получился в пределах примерно строки из 1600 символов на всю эту однострочную функцию. Для моей задачи в принципе хватило. Поэтому пока что за новым рекордом не гонюсь. Но если у тебя тоже однострочная фукнция и при этом еще и намного короче - было бы любопытно глянуть на подход, которым удалось так сократить.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика