На главную
 

ProGa - Cумма прописью - ст.1

      Переведение суммы числом в сумму прописью – риторическая задача, решаемая однажды многими программистами для надобности либо для развлечения. Честно говоря, я человек ленивый, поэтому можно считать героическим поступком данную статью. В ней я последовательно и очень подробно объясняю каждую строку кода. Если у Вас хватит терпения полностью разобраться в написанном, то программист из Вас точно выйдет. Если же комментарии Вас мало интересуют, то переходите к самому концу статьи и смотрите инструкцию по внедрению программы в Ваш MS Word. Программа (по идее :) должна выполнять преобразование выделенного пользователем числа в число и сумму прописью в скобках

      Стандартная строка, дающая имя процедуры и определяющая ее начало.

Sub NumberToString()

      Далее идет определение переменных. Их значение будет раскрыватся в самой программе. Обратите внимание, что в некоторых строках объявляются несколько переменных сразу. Многие начинающие программисты делают ошибку объявляя несколько переменных в одной строке таким, например, образом "Dim i,j as integer”. В этом случае как целочисленная переменная объявляется только j, а i остается типа Variant (этот тип несколько медленней обрабатывается)

Dim strNumber As String
Dim Digitals() As Integer
Dim BigDig As Integer
Dim Dig1 As Integer, Dig2 As Integer, Dig3 As Integer
Dim AvDig As Integer
Dim DigCount As Integer
Dim BigDigCount As Integer
Dim BigDigNames(4, 2) As String
Dim DigNames(9, 2) As String
Dim From11till19(9) As String
Dim Result As String
Dim i As Integer
Dim Pointer As Integer
Dim Temp As Integer

      Эта процедура при возникшей ошибке передает управление к метке EndSub (фактически заканчивает программу без вывода сообщения об ошибке). Где такая ошибка может возникнуть, мы покажем далее.

On Error GoTo EndSub

      Заполнение массива имен групп разрядов. 1-й индекс – номер группы разрядов по 3 цифры. 2-й – число, к которому относиться форма существительного. Например, первая группа разрядов (от 0 до 999) называется денежной еденицой (0 гривен, 1-а гривна 2-е гривны). И так по всем группам разрядов до триллиардов. Я думаю большими суммами у нас пока-что не оперируют.

BigDigNames(0, 0) = "гривен"
BigDigNames(0, 1) = "гривна"
BigDigNames(0, 2) = "гривны"
BigDigNames(1, 0) = "тысяч"
BigDigNames(1, 1) = "тысяча"
BigDigNames(1, 2) = "тысячи"
BigDigNames(2, 0) = "миллионов"
BigDigNames(2, 1) = "миллион"
BigDigNames(2, 2) = "миллиона"
BigDigNames(3, 0) = "миллиардов"
BigDigNames(3, 1) = "миллиард"
BigDigNames(3, 2) = "миллиарда"
BigDigNames(4, 0) = "триллиардов"
BigDigNames(4, 1) = "триллиард"
BigDigNames(4, 2) = "триллиарда"

      Заполняем названия цифр от 1 до 9 всех трех разрядов группы. 1-й индекс – цифра, 2-й – номер разряда в группе от 0 (самый младший) до 2.

DigNames(1, 0) = "один"
DigNames(2, 0) = "два"
DigNames(3, 0) = "три"
DigNames(4, 0) = "четыре"
DigNames(5, 0) = "пять"
DigNames(6, 0) = "шесть"
DigNames(7, 0) = "семь"
DigNames(8, 0) = "восемь"
DigNames(9, 0) = "девять"
DigNames(1, 1) = "десять"
DigNames(2, 1) = "двадцать"
DigNames(3, 1) = "тридцать"
DigNames(4, 1) = "сорок"
DigNames(5, 1) = "пятьдесят"
DigNames(6, 1) = "шестьдесят"
DigNames(7, 1) = "семьдесят"
DigNames(8, 1) = "восемьдесят"
DigNames(9, 1) = "девяносто"
DigNames(1, 2) = "сто"
DigNames(2, 2) = "двести"
DigNames(3, 2) = "триста"
DigNames(4, 2) = "четыреста"
DigNames(5, 2) = "пятьсот"
DigNames(6, 2) = "шестьсот
DigNames(7, 2) = "семьсот"
DigNames(8, 2) = "восемьсот"
DigNames(9, 2) = "дявятьсот"

      Кроме всех этих слов нам еще понадобятся названия цифр от 11 до 19.

From11till19(1) = "одиннадцать"
From11till19(2) = "двенадцать"
From11till19(3) = "тринадцать"
From11till19(4) = "четырнадцать"
From11till19(5) = "пятнадцать"
From11till19(6) = "шестнадцать"
From11till19(7) = "семнадцать"
From11till19(8) = "восемнадцать"
From11till19(9) = "девятнадцать"

      Взаимодействуем с любимым Word-ом – это первая встреча с объектом. Объект selection предоставляет доступ к выделенному на странице тексту. Свойство Text возвращает строковое значение этого текста. Так как пользователь может случайно захватить вместе с числом пару лишних пробелов их нужно срочно удалить (никогда нельзя думать, что пользователь сделает все как нужно). Функция Trim обрезает пробелы с обоих сторон строки-аргумента.

strNumber = Trim(Selection.Text)

      Вычисляем длинну полученной строки с помощью функции Len:

DigCount = Len(strNumber)

      Нам необходимо, чтобы все разряды групп разрядов (извините за тавтологию) были заполнены, так что к числу нужно добавить недостающие ноли. В цикле, организованном ниже с помощью оператора Do…Loop, цикл добавляет к строке слева нули до тех пор, пока DigCount не станет кратным трем. Кратность проверяется с помощью оператора mod, который вычисляет остаток от деления.

Do Until DigCount Mod 3 = 0
      strNumber = "0" & strNumber
      DigCount = DigCount + 1
Loop

      Вычисляем количество групп разрядов. Функция fix отбрасывает дробную часть и превращает результат в целое число. Но зачем, если мы итак знаем, что оно целое, спросите Вы? Это мы с Вами знаем, а он (компьютер) не уверен и поэтому результат деления воспринимает как вещественной число и при попытке присвоить его целочисленной переменной, возникает ошибка несоответствия типа. Для ее избежания мы и используем функцию.

BigDigCount = Fix(DigCount / 3)

      Помните я оговорился, что врядле кто-нибудь будет использовать числа более 999 триллиардов гривен. Но все может быть. Непоседливый пользователь может просто ошибиться или проэкспериментировать. Следующая строка проверяет количество групп разрядов. Если оно превышает допустимое, то процедура Exit Sub заканчивает выполнение программы досрочно.

На следующую страницу

К началу На главную
Designed by ProGa ®
Hosted by uCoz