progr exel
Option Explicit
Public crit As String
Function Suma_Propisom(dnu As Double) As String
Dim rub, kop As Long
Dim dnum As Double
dnum = dnu + 0.005
rub = Fix(dnum)
kop = Fix((dnum - rub) * 100)
Suma_Propisom = Func_StrNum(dnum, 0) & " руб. " & kop & "коп."
End Function
Function Func_StrNum(dnum As Double, iRod As Integer)
Dim i As Integer
Dim strRes As String
If dnum < 0 Then
Func_StrNum = ""
Exit Function
End If
dnum = Fix(dnum)
If dnum = 0 Then
Func_StrNum = "Нуль"
Exit Function
End If
strRes = "" 'выходная строка сначала пустая
i = CInt(Fix(dnum) - Fix((Fix(dnum) / 1000)) * 1000) 'выделяет младшие 3 разряда как целое число 0...999
If i <> 0 Then
strRes = Func_0_999(i, iRod)
End If
dnum = Fix(dnum / 1000) 'отбрасывает младшие три разряда (обработанные)
If dnum <> 0 Then
i = CInt(Fix(dnum) - Fix((Fix(dnum) / 1000)) * 1000) 'выделяет группу из 3 разрядов(тысячи)как целое число 0...999
If i <> 0 Then
If strRes <> "" Then
strRes = " " & strRes
End If
strRes = Func_0_999(i, 1) & Func_0_999_Def(i, 2) & strRes
End If
Else
GoTo lbUpFirst
End If
dnum = Fix(dnum / 1000)
If dnum <> 0 Then
i = CInt(Fix(dnum) - Fix((Fix(dnum) / 1000)) * 1000) 'выделяет группу из 3 разрядов(миллионы) как целое число 0...999
If i <> 0 Then
If strRes <> "" Then
strRes = " " & strRes
End If
strRes = Func_0_999(i, 0) & Func_0_999_Def(i, 3) & strRes
End If
Else
GoTo lbUpFirst
End If
dnum = Fix(dnum / 1000)
If dnum <> 0 Then
i = CInt(Fix(dnum) - Fix((Fix(dnum) / 1000)) * 1000) 'выделяет группу из 3 разрядов(миллиарды)как целое число 0...999
If i <> 0 Then
If strRes <> "" Then
strRes = " " & strRes
End If
strRes = Func_0_999(i, 0) & Func_0_999_Def(i, 4) & strRes
End If
Else
GoTo lbUpFirst
End If
lbUpFirst:
Func_StrNum = UCase(Left(strRes, 1)) & Right(strRes, Len(strRes) - 1) 'делает первую букву большой
End Function
Function Func_0_999_Def(ByVal inum As Integer, iDef As Integer)
'выбор варианта определяющего слова
'iDef=0 - копійка
'iDef=1 - гривня
'iDef=2 - тисяча
'iDef=3 - мільйон
'iDef=4 - мільярд
'iDef=5 - день
Dim DefVars As Variant
Dim ivar As Integer
DefVars = Array("копійка", "копійки", "копійок", _
"гривня", "гривні", "гривень", _
"тисяча", "тисячі", "тисяч", _
"мільйон", "мільйона", "мільйонів", _
"мільярд", "мільярда", "мільярдів", _
"день", "дня", "днів")
inum = inum Mod 100
iDef = iDef Mod 6
Select Case True
Case inum >= 5 And inum <= 20
ivar = 2
Case (inum Mod 10) = 1
ivar = 0
Case (inum Mod 10) >= 2 And (inum Mod 10) <= 4
ivar = 1
Case Else
ivar = 2
End Select
Func_0_999_Def = " " & DefVars(iDef * 3 + ivar)
End Function
Function Func_0_999(inum As Integer, iRod As Integer)
'Число из диапазона 0...999 прописью, используется в функции Func_0_999_Def
'iRod=0 - муж род
'iRod=1 - жен род имен падеж
'iRod=2 - жен род винит падеж
'inum - преобразуемое число
Dim WordsNum As Variant
Dim prp As String, i, j As Integer
WordsNum = Array("один", "два", "три", "чотири", "п'ять", "шість", "сім", "вісім", "дев'ять", "десять", _
"одинадцять", "дванадцять", "тринадцять", "чотирнадцять", "п'ятнадцять", "шістнадцять", "сімнадцять", "вісімнадцять", "дев'ятнадцять", _
"двадцять", "тридцять", "сорок", "п'ятьдесят", "шістьдесят", "сімдесят", "вісімдесят", "дев'яносто", _
"сто", "двісті", "триста", "чотириста", "п'ятьсот", "шiстьсот", "сiмсот ", "вiсiмсот", "дев'ятьсот")
If iRod = 1 Then
WordsNum(0) = "одна"
WordsNum(1) = "двi"
Else
If iRod = 2 Then
WordsNum(0) = "одну"
WordsNum(1) = "двi"
End If
End If
prp = "" 'выходная строка сначала пустая
i = inum \ 100 'число сотен
If i <> 0 Then
prp = WordsNum(i + 26) 'выбор слова сотен, счёт от 0 - поэтому 26
End If
i = inum - i * 100 'удаление сотен
If i <> 0 Then
If i <= 20 Then
prp = prp & " " & WordsNum(i - 1)
Else
j = i \ 10 'число десятков от 3
prp = prp & " " & WordsNum(j + 17)
j = i - j * 10
If j <> 0 Then
prp = prp & " " & WordsNum(j - 1)
End If
End If
End If
If prp <> "" Then
prp = Left(prp, Len(prp))
End If
Func_0_999 = prp
End Function
Свидетельство о публикации №213040401642