Участник
|
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, напишите личное сообщение администратору.
|