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