Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Как-то, с полгода назад кажется, подправлял по мелочам одну из задач и захотелось попробовать встроить функцию, выводящую сумму прописью - непосредственно в сам report, вставив ее в Init окружения рипорта (в принципе на форуме про это рассказывал), все вроде бы и вышло неплохо, разве что функция получилась как бы "одноразовая", т.е. если скажем для печати платежки это отлично подходит, то в общем случае - использовать ее, например для вывода где-то в итогах группы, разумеется уже никак не получится.
На днях же попутно со всякой текучкой начал делать задачку совсем иного рода, где как раз бы и нужен был бы вывод именно в итогах группы. В принципе ну можно конечно поступить классически обычным образом - вызывая процедуру откуда-то из внешнего prg и т.п. Но как-то оно все уж слишком неинтересно. И, пока время со всем этим терпит, захотелось все-таки немного поизвращаться. В смысле попридумывать и еще какие-то иные варианты. Ну а если уж не получится - так хоть поупражняться с этой небольшой головоломкой, все польза какая-то. Одно решение, причем похоже вполне реально выполнимое, нащупал довольно-таки быстро, вот только добить там все до конца пока что так и не дали. Хотя думаю, если не будут усиленно мешать, может быть даже завтра оно уже и будет готово. Но решил все-таки и полюбопыствовать - возможно кто-то или уже решал что-то подобное, или может быть сможет найти какой-то иной, свой, более оптимальный вариант. Ну в общем суть задачи думаю уже давно понятна - даже и из названия: - Написать однострочную функцию преобразования числа в строку, представляющую собой его числительное, или же попросту - число прописью. Пока писал сегодня эту функцию - не раз мелькала мысль: все-таки до чего же разнообразны числительные в русском языке, предоставляя программисту такие уникальные возможности по работе над подобными головоломками, каких наверно не дает ни один другой язык. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Я так понимаю, что цель не "функция", а на самом деле ВЫРАЖЕНИЕ переводящее число в "строку прописью". Как мне кажется, вот это решение можно записать в виде одного простого, но весьма и весьма длинного выражения (возможно убрав проверку, отсекающую "слишком крупные суммы", и "допилив" имеющиеся недочёты).
------------------ WBR, Igor |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну в принципе я с утра уже допилил свое вчерашнее начинание. И как раз таки STRTRAN и использовал, причем немного похожим образом. Хотя тут наверно и трудно что-то другое придумать. В качестве вывода на экран все работает, вот с рипортом правда еще не проверял, тут может размер подвести - уж слишком длинная строка вышла. Сейчас подсчитал - 5600 символов.
Может попробую как-то оптимизировать на досуге. Потому что например при попытке вставить это дело в цикл, когда захотелось визуально убедиться в нормальном виде уже во всем диапазоне "сплошным потоком" (отстраивал по тройкам, там вроде показывало хорошо) - фокс перепугался и начал что-то бормотать про слишком большую глубину вложенности. Где-то вроде есть настройка увеличения глубины, но что-то не охота было лазить - в принципе уверен, что все работает и в полном диапазоне. Поскольку и все тройки, и все переходные моменты проверил. А все же жаль, что в Windows не предусмотрена встроенная функция для числительных для всех языков существующих локализаций. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Хотя. Посмотрел повнимательнее. Возможно все-таки в решении метод окажется чуть более оптимальным, и строка даже покороче. Может тоже попробую на досуге.
Кстати, там написано, что это "самое короткое решение", но у меня давно уже написано и используется и еще более короткое. ;) К сожалению его "свернуть" в принципе не получится, оно сделано несколько специфически. Т.е. только в многострочном варианте проходит. Хотя как раз от него я и отталкивался при разработке своей строки. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) Исправлено 1 раз(а). Последнее : Crispy, 12.08.11 12:17 |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Влад Колосов Сообщений: 22664 Откуда: Ростов-на-Дону Дата регистрации: 05.05.2005 |
А с чем связана такая необходимость? Портируемость отчета?
------------------ Совершенство - это не тогда, когда нельзя ничего прибавить, а тогда, когда нечего убавить. |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну в общем-то да. Как первоначальный толчок. А затем - еще и просто попытка "поиска доселе неизведанного".
------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Goodwin Сообщений: 3539 Откуда: Омск Дата регистрации: 03.05.2006 |
А разве выражение в репорте могёт быть длиннее 254?
------------------ Что мы знаем о лисе? Ничего. И то не все. (С)Б. Заходер |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Да судя по дефолтным настройкам нет - в чем лишний раз опять убедился уже с утра, тупо вставив в тайной надежде, а вдруг. Иногда такое все же прокатывает, говорят даже явление индуктивности так было открыто.
И хотя и получил из решения (слегка модифицировав вариант Ромы), как и предполагал в пятницу, уже намного более короткий вариант строки (теперь уже порядка всего лишь 1600 символов), но тем не менее рипорт ее обрезает до своего стандарта. Не знаю есть ли какая-то "расширяющая" установка (никогда не было особой необходимости) - надо будет на всякий случай глянуть по хелпу, но скорее всего этот вариант не прокатит. Как впрочем и можно было предположить. Есть однако ж и еще одна идея попытаться через переменные. Хотя и допускаю, что все равно кроме получившейся уже этой "самой короткой строки-1600" ничего тут тоже не выйдет. Но вдруг что-то и нащупается. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Yes!Yes!Yes! Самое смешное - работает! В смысле - элементарное объединение моего первого способа с этой самой, полученной чрез свертывание, "короткой строкой".
Есть правда один странный момент, связанный с непонятным преждевременным переполнением при суммировании. Но думаю это все же разрешимо. Пока что же (для меня по-крайней мере) пожалуй более важен оказался сам факт возможности подобного вычисления внутри рипорта. Особая признательность Игорю - за натолкновение на вариант со все же более оптимизированными заменами, чем как оказалось были в моем первом решении. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) Исправлено 1 раз(а). Последнее : Crispy, 15.08.11 12:46 |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Ну все в принципе. Суммирование через встроенную в рипорт наращиваемую переменную окончательно решило все проблемы. Если бы это было бы кому-то еще интересно, оставалось бы только еще оформить - и в решения. Но похоже все это было чисто "сам на сам". Ну попробую все же ради интереса в новом проекте, зря что ли оно было.
------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Goodwin Сообщений: 3539 Откуда: Омск Дата регистрации: 03.05.2006 |
За экспериментаторство - пять.
Но сама идея не очень: функция получится раскопипащенной в стопицот мест, и для замены в исходниках 'руб.' на 'рублей' прийдётся отдельную громоздкую тулзу писать. Может лучше положить рядом библиотеку (или доставать и класть её из поля отчёта в рантайме) и цеплять её в событии репорта? Или даже не цепляя как библиотеку, запущать процедуру с параметрами: ExecScript(chrt('n=1000;do libs\libs\code with @n;return n', ';', chr(13)) Хотя это тоже изврат тот ещё. ------------------ Что мы знаем о лисе? Ничего. И то не все. (С)Б. Заходер |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
Да в принципе даже валюта меняется очень легко, не то что там "'руб.' на 'рублей'". Всего лишь добавляется параметр. Так что результатом пока что доволен. Уже даже прикрутил для пары выводов. А сейчас, обдумывая открывшиеся в связи с преодолением "порога-254" новые возможности, как бы прохожу период, подобный неожиданному попаданию в магазин с кучей всяческой всячины, о существовании которой до этого даже не предполагал.
Т.е. например можно иметь просто готовую болванку рипорта, которая сама будет иметь возможность выводить кучу разной полезной рукописности, и при необходимости ее использовать вместо стандартного пустого макета. Кстати вчера читая форум по ходу и еще пару идеек похоже придумалось в сходном направлении. Но это надо еще проверять. Да и пока что они как бы не особо и необходимы. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Разные валюты по разному склоняются - так что без влезания "внутрь" хитрого выражения весьма проблематично сделать её универсальной.
------------------ WBR, Igor |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Goodwin Сообщений: 3539 Откуда: Омск Дата регистрации: 03.05.2006 |
Сразу-то да.
А вот сопровождать/обновлять функции после, в уже готовых репортах, весьма накладно будет. Да и что это за репорт такой: сам-в-себе? Всё равно он в каком-то проекте, а в проекте и библотеки есть. ------------------ Что мы знаем о лисе? Ничего. И то не все. (С)Б. Заходер |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
medstrax Забанен Сообщений: 5964 Дата регистрации: 23.03.2007 |
Клоака в склонениях. Увы
|
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Taran Сообщений: 13624 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Эээ. Пардон вроде про сумму прописью давненько все закрыли.
Чуток стесняюсь, надавите - выложу свою (конечно что-то с кем-то). Род единицы и пр.. |
Re: Функция "сумма прописью" - в одну строку | |
---|---|
Crispy Автор Сообщений: 18571 Дата регистрации: 16.05.2005 |
При сделанной мной структуре замена валют с их склонениями - становится в принципе вещью довольно элементарной. В разумных пределах разумеется. Ну где-то 2-3 скажем, ну 8-9. Но никак не 15. Хотя при желании можно впихать и 15 возможно. Однако в подобных случаях удобнее все же использовать обычную внешнюю таблицу, подключаемую к любому подходящему для этого стандартному решению по числительным.
Так у тебя она что - тоже однострочная? И какой длины это все будет, если в символах? Мой рекорд (на основе функции Ромы из решения по ссылке Игоря) - пока что получился в пределах примерно строки из 1600 символов на всю эту однострочную функцию. Для моей задачи в принципе хватило. Поэтому пока что за новым рекордом не гонюсь. Но если у тебя тоже однострочная фукнция и при этом еще и намного короче - было бы любопытно глянуть на подход, которым удалось так сократить. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
© 2000-2024 Fox Club  |