Перевод денежной суммы из числового представления в слова. Сумма может содержать до 15 разрядов в целой части и до 18 разрядов в дробной. Возможно округление результата.
Прислал: Владимир Максимов  Категория: Интерфейс
Перевод денежной суммы из числа в слова
Несколько слов о том, почему я вообще решил выложить это решение. Вроде бы большое количество
примеров на эту тему есть в разделе "Нетривиальные задачи", да и здесь есть решение Михаила
Дунькина - "propis".
Вот поначалу и я так подумал. Но оказалось, что в разделе "Нетривиальные задача" к этому решению
предъявлялось ряд специфических требований выполнение которых делало код практически нечитаемым.
Мне потребовалось почти полдня чтобы разобраться в логике всех представленных там решений. А если
добавить к этому, что в представленных решения слова "рубли" и "копейки" вообще не фигурируют, то
использование их "в чистом виде" становится крайне затруднительным.
Вот поэтому, я и решил взяв кое-какие полезные идеи из предоставленных решений довести их до
стадии "рублей" и "копеек".
Получившийся код не есть идеал с точки зрения эффективности или производительности. Моя задача
была сделать его достаточно простым и максимально понятным с тем, чтобы любой пользователь мог с
легкостью адаптировать предлагаемый код под свою задачу затратив минимальные усилия. Надеюсь, это
мне удалось.
Заинтересовался проблемой.
Всегда преобразовывал, как говорили бухгалтеры (например для долларов - пропись долларов nn/100
центов).
Так вот - ни в инете, ни в консультанте+ не нашел каких либо инструкций по заполнению поля "сумма
прописью" в документах, где это поле используется. Единственно, где нашел - в "ПОЛОЖЕНИЕ О
БЕЗНАЛИЧНЫХ РАСЧЕТАХ В РОССИЙСКОЙ ФЕДЕРАЦИИ" от 12 апреля 2001 г. N 2-П ЦБ РФ - в платежных
поручениях и др. банковских док-тах.
Я это к чему?
Хотелось бы иметь универсальную программу перевода числа в слова (применения, кроме как в
финансовых документах, я ей не вижу), т.е.
1. кроме рублей использовать другие валюты (видимо достаточно доллары, евро и гривны :) );
2. предусмотреть разные варианты написания "копеек" -
например: 2 копейки, две копейки, 02/100 коп. ets;
3. когда-то пришлось написать это для английского языка -
так-что можно cделать и "несколькоязычный" вариант :).
Вот собственно и все мысли по поводу.
С уважением, Захаров Д.
ЗЫ У меня примерно 6-8 практически одинаковых прог. (алгоритм-то один) на "все" случаи :((( - все
руки не доходят...
Владимир Максимов
11.07.02 13:01:05
Ну, вообще-то, предложенный мной вариант предусматривает 2 варианта написания "копеек": в виде
числа и в виде слов. Думаю, добавить другие варианты будет также не сложно.
Подправить для других видов валют тоже не вижу проблем. Всего-то и надо сделать замену 8 элементов
массива. Можно организовать эту замену по соотвествующему параметру.
Денис В. Степанов
07.08.02 12:10:21
вот только что скачал. Еще даже не пускал, чиста посмотрел код. Знаешь, что хочется сказать - та
же Propis - она работает, но стиль написания... Не хотелось ничего вставлять в проекты то, что
надыбил (а свою прогу похерил куда-то) А вот твоюююю! :) Это тебе не лесть, как к уважаемому мной
челу. Это просто еще и призыв другим разработчикам - скачайте вариант и посмотрите - _как_ нужно
грамотно и красиво оформлять свой код! Не бойтесь добавить пАру букв в префикс, табуляции и стиль
написания команд!! Красиво вобщем и достойно для любого проекта!
Денис В. Степанов
07.08.02 15:50:29
Вс:е-таки у себя на месте решил подписать вторым параметром tlProper, со смещением остальных. Он
как раз в конце проги перевовить (если .Т.) в заглавную букву. Фишка оказалась нужна в рапорте
счета не предоплату. И чтоб не плодить переменных извне - перекинул рекомендуемую тобой замену в
самой ф-ции. Так что если есть возможноть править твое решение - IMHO лучше так и сделать
Владимир Максимов
12.08.02 10:45:46
Исправил. Теперь по умолчанию результирующая строка начинается с заглавной буквы. И добавлен
соответсвующий параметр, регулирующий этот факт.
Хотя, идея решения заключалась как раз в том, чтобы пользователи сами адаптировали его под свои
нужды.
Денис В. Степанов
12.08.02 15:42:33
Решение - грамотное! Зато что теперь нариканий - 0! Грамотно сделано и функциональность полная!
Сидоренко Вячеслав
27.08.04 13:12:17
Необходимо было это программулину прикрутить к евро и долларом, немного модифицировал и получилось
очень удачное решение :)
* Добавил еще один параметр nTypeOfValuta
* nTypeOfValuta - 1- Российские рубли (по умолчанию)
* 2- Доллары
* 3- Евро
FUNCTION Money2Str
LPARAMETERS yMoney, nRound, IsWord, AllLower, nTypeOfValuta
.......
* Уточняю значение используемого типа валюты, по умолчанию рубли
IF TYPE("nTypeOfValuta")<>"N" OR Between(nTypeOfValuta,1,3)=.F.
nTypeOfValuta=1
ENDIF
......
* Изменил Массив "размерностей"
.......
DO CASE
CASE nTypeOfValuta=1
paDimensions[5,1]=' один рубль'
paDimensions[5,2]=' два рубля'
paDimensions[5,3]=' рубля'
paDimensions[5,4]=' рублей'
paDimensions[6,1]=' одна копейка'
paDimensions[6,2]=' две копейки'
paDimensions[6,3]=' копейки'
paDimensions[6,4]=' копеек'
CASE nTypeOfValuta=2
paDimensions[5,1]=' один доллар'
paDimensions[5,2]=' два доллара'
paDimensions[5,3]=' доллара'
paDimensions[5,4]=' долларов'
paDimensions[6,1]=' один цент'
paDimensions[6,2]=' два цента'
paDimensions[6,3]=' цента'
paDimensions[6,4]=' центов'
CASE nTypeOfValuta=3
paDimensions[5,1]=' евро'
paDimensions[5,2]=' евро'
paDimensions[5,3]=' евро'
paDimensions[5,4]=' евро'
paDimensions[6,1]=' один цент'
paDimensions[6,2]=' два цента'
paDimensions[6,3]=' цента'
paDimensions[6,4]=' центов'
ENDCASE
* Массив "единиц"
........
Lapizkaj
22.09.07 18:18:06
Замечательная программа и полностью готовая к применению, и мне очень помогла в быстром решении
поставленной передо мной задаче. Спасибо!