AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX Blogs
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.03.2012, 16:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,459 / 846 (79) +++++++
Регистрация: 28.10.2006
axforum blogs: Сумма прописью (RU): Axapta, VBA и Excel (в одной ячейке!)
Источник: http://axforum.info/forums/blog.php?b=112
==============

<div>Это сообщение готовилось к публикации почти два года тому назад. Тогда мне потребовалась сумма прописью в своей разработке. Прошерстив форум, нашёл ссылки на класс RNumDateInWordConverter, но что-то с первого раза с этим классом не получилось. Потом, правда, срослось, но "осадок остался" и появилось горячее желание прикоснуться к теме лично, тем более, что в голове сложился своеобразный алгоритм решения (как мне кажется... или это только мне кажется его своеобразность? :)). Этим алгоритмом мне тогда и хотелось поделиться, но текучка отложила этот радостный момент на неопределенный срок.

Предлагаемый алгоритм основывается на переводе исходного числа (его целой части) в последовательность триад и в обработке каждой триады как числа от 0 до 999. При этом к соответствующей разрядности типа "тысяч", "миллионов", "миллиардов" относимся так же, как к любому считаемому существительному, например, к "рублям" или иным единицам (метрам, штукам и т.п.). Это позволяет вынести алгоритм обработки триады в отдельную, достаточно компактную функцию, снаружи которой процесс сводится к нескольким ее вызовам с соответствующей считаемой единицей в качестве параметра.

С деталями алгоритма можно ознакомиться по приведенным ниже текстам метода sumInWords_RU (для Аксапты) и одноименной же функции (для VBA).
<div class="xpp">X++:
// KKu, 23.04.2010 --> РУССКАЯ СУММА ПРОПИСЬЮ// _sourceReal - вещественное число для прописи (минус и дробная часть игнорируются при обработке)// _unit1,_unit2,_unit5 - формы считаемого существительного соответственно для 1 единицы, 2 ед-ц и 5 ед-ц// _gender - код рода считаемого существительного = 1-мужской, 2-женский, 3-средний// _capital - в возвращаемой строке делать большими буквы:// 0-всё маленькими, 1-только самую первую букву всей строки,2-первая буква каждой триадыstatic str sumInWords_RU( real _sourceReal, str _unit1 = 'рубль', // (один) рубль str _unit2 = 'рубля', // (два ) рубля str _unit5 = 'рублей', // (пять) рублей int _gender = 1, // 1 - мужской (рубль) int _capital = 1 ) // 1 - только первая всей строки{ str strSource = strFmt('00%1', num2str( trunc((abs(_sourceReal))),1,0,1,0 )); int cntTriad = trunc(strLen(strSource)/3); str сurrTriad, morePwr12, fRet; int i; str triadWords(str triad, str unit1, str unit2, str unit5, int gender) { str ret = conPeek(['','сто ','двести ','триста ','четыреста ', 'пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '], str2int(subStr(triad,1,1))+1 ); str currUnit = unit5; ; if (strSource=='000') { ret = 'ноль '; } else if (subStr(triad,2,1)=='1') { ret += conPeek(['десять','одиннадцать','двенадцать','тринадцать','четырнадцать', 'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'], str2int(subStr(triad,2,2))-9 ) + ' '; } else { ret += conPeek(['','','двадцать ','тридцать ','сорок ', 'пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '], str2int(subStr(triad,2,1))+1 ); ret += conPeek(['',conPeek(['один ','одна ','одно '],gender), conPeek(['два ' ,'две ' ,'два ' ],gender), 'три ','четыре ','пять ','шесть ','семь ','восемь ','девять '], str2int(subStr(triad,3,1))+1 ); currUnit = conPeek([unit5, unit1, unit2,unit2,unit2, unit5,unit5,unit5,unit5,unit5], str2int(subStr(triad,3,1))+1 ); } return ret ? strFmt('%1%2 ', str2Capital(ret), currUnit) : (cntTriad-i+1)==1 ? currUnit : ''; } ; strSource = subStr(strSource, strLen(strSource)-cntTriad*3+1, cntTriad*3); for (i=1; i

Источник: http://axforum.info/forums/blog.php?b=112
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Управление axapta из Excel VBA Могиканин DAX: Программирование 9 28.02.2012 15:36
Microsoft Dynamics CRM Team Blog: Excel 2010 and Data Import Templates Blog bot Dynamics CRM: Blogs 0 08.03.2011 00:12
Мелкомягкий CRM: Панель управления для MS CRM с помощью Reporting Services Blog bot Dynamics CRM: Blogs 1 24.08.2009 14:41
Интеграция ERP-системы Navision Axapta, КОМПАС и PartY PLUS [andproject.ru] Nikolson Полезное по Microsoft Dynamics 0 17.07.2002 18:45
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.