Сумма прописью от http://mtdmacro.ru (платежка)

' :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
' (C) Александр, http://mtdmacro.ru, mtdmacro@mail.ru
' :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Option Explicit

Private N(1 To 14) As Byte
Private A, строка As String
Private A1_муж, A1_жен, A2, a3, a0

Function Пропись(Сумма, Optional Показывать_ноль_копеек As Boolean)
Dim Миллиарды, Миллионы, Тысячи, Рубли, Копейки
Dim Позиция_разделителя As Long, Коп As String, i As Long
  A1_муж = Array("", "один ", "два ", "тpи ", "четыpе ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
  A1_жен = Array("", "одна ", "две ", "тpи ", "четыpе ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
  a0 = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
  A2 = Array("", "десять ", "двадцать ", "тpидцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
  a3 = Array("", "сто ", "двести ", "тpиста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
  Миллиарды = Array("миллиард", "миллиарда", "миллиардов")
  Миллионы = Array("миллион", "миллиона", "миллионов")
  Тысячи = Array("тысяча", "тысячи", "тысяч")
  Рубли = Array("белорусский рубль", "белорусских рубля", "белорусских рублей")
  Копейки = Array("копейка", "копейки", "копеек")
  A = ""
  Позиция_разделителя = InStr(1, Сумма, "=", 1) + InStr(1, Сумма, "-", 1) + InStr(1, Сумма, ".", 1) + InStr(1, Сумма, ",", 1)
  If Позиция_разделителя = 0 Then
    Коп = "00"
    Позиция_разделителя = Len(Сумма) + 1
  Else
    Коп = Left(Mid(Сумма, Позиция_разделителя + 1, 2) & "00", 2)
  End If
  строка = Right("000000000000" & Mid(Сумма, 1, Позиция_разделителя - 1), 12)
  If Val(строка)  999999999999.99 Then
    Пропись = "Cумма выходит за границы допустимого диапазона (0-999999999999.99)."
    Exit Function
  End If
  For i = 1 To 12
    N(i) = Val(Mid(строка, i, 1))
  Next i
  For i = 13 To 14
    N(i) = Val(Mid(Коп, i - 12, 1))
  Next i
  If Разбор(0) Then
    A = A & Миллиарды(Склонение(0)) + " "
  End If
  If Разбор(3) Then
    A = A & Миллионы(Склонение(3)) + " "
  End If
  If Разбор(6) Then
    A = A & Тысячи(Склонение(6)) + " "
  End If
  Call Разбор(9)
  If A  "" Then A = A & Рубли(Склонение(9)) & " "
  A = UCase(Mid(Trim(A), 1, 1)) & Mid(Trim(A), 2)
  If Not Показывать_ноль_копеек And Коп = "00" Then Else _
    A = A & " " & Коп & " " & Копейки(Склонение(11))
  Пропись = A
End Function

Function Разбор(Сдвиг) As Boolean
  If Val(Mid(строка, 1 + Сдвиг, 3))  0 Then
    A = A & a3(N(1 + Сдвиг))
    If N(2 + Сдвиг) = 1 Then
        A = A & a0(N(3 + Сдвиг))
    Else
        A = A & A2(N(2 + Сдвиг)) & IIf(Сдвиг = 6, A1_жен(N(3 + Сдвиг)), A1_муж(N(3 + Сдвиг)))
    End If
    Разбор = True
  Else
    Разбор = False
  End If
End Function
    
Public Function Склонение(Сдвиг)
  If N(2 + Сдвиг) = 1 Then
    Склонение = 2
  Else
    Select Case N(3 + Сдвиг)
        Case 1
            Склонение = 0
        Case 2 To 4
            Склонение = 1
        Case Else
            Склонение = 2
    End Select
  End If
End Function

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *