Function СУММАПРОПИСЬЮ_П(n As Double, Optional m As Integer = 0) As String
'проверка корректности округления исходного значения, для которого формируется текстовое представление
Otherside = InStr(1, n, ",") ' точку заменил на запятую
'''''''''''''''''''''''''''''''''
If n < 0 Then Znak = "минус " Else Znak = ""
n = WorksheetFunction.Round(Abs(n), 3) ' Добавленная строка, округляет значение
Darth_Vader = Round(n - Int(n), 3) * 1000
Dim Nums1, Nums2, Nums3, Nums4 As Variant
Nums1 = Array("", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ", "ноль ")
Nums2 = Array("", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
Nums3 = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
Nums4 = Array("", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
Nums5 = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
'''''''''''''''''''''''''''''''''
'разделяем число на разряды, используя вспомогательную функцию Class
ed = Class(n, 1)
dec = Class(n, 2)
sot = Class(n, 3)
ed_1 = Class(Darth_Vader, 1)
dec_1 = Class(Darth_Vader, 2)
sot_1 = Class(Darth_Vader, 3)
tys = Class(n, 4)
dectys = Class(n, 5)
sottys = Class(n, 6)
mil = Class(n, 7)
decmil = Class(n, 8)
sotmil = Class(n, 9)
bil = Class(n, 10)
decbil = Class(n, 11)
sotbil = Class(n, 12)
'определяем сотни миллиардов
Billions:
sotbil_txt = Nums3(sotbil)
'проверяем миллиарды. если в числе есть десятки / сотни миллиардов, используется код ниже
Select Case decbil
'в случае если разряд "десятки миллиардов" равен одному, применяется массив Nums5 (десять - девятнадцать миллиардов).
Case 1
bil_txt = Nums5(bil) & "миллиардов "
'в случае 1 работа с миллиардами завершена, поэтому переходим к миллионам
GoTo Millions
'в случае если разряд "десятки миллиардов" от 2 до 9, применяется массив Nums2 (двадцать - девяносто миллиардов)
Case 2 To 9
decbil_txt = Nums2(decbil)
End Select
Select Case bil
Case 0
If decbil > 0 Then bil_txt = Nums1(bil) & "миллиардов "
Case 1
bil_txt = Nums1(bil) & "миллиард "
Case 2, 3, 4
bil_txt = Nums1(bil) & "миллиарда "
Case 5 To 9
bil_txt = Nums1(bil) & "миллиардов "
End Select
'Если отсутствуют "десятки" / "единицы" миллиардов, используются сотни миллиардов
If decbil = 0 And bil = 0 And sotbil <> 0 Then sotbil_txt = sotbil_txt & "миллиардов "
'определяем сотни миллионов
Millions:
sotmil_txt = Nums3(sotmil)
'проверяем миллионы. если в числе есть десятки / сотни миллионов, используется код ниже
Select Case decmil
'в случае если разряд "десятки миллионов" равен одному, применяется массив Nums5 (десять - девятнадцать миллионов)
Case 1
mil_txt = Nums5(mil) & "миллионов "
'в случае 1 работа с миллионами завершена, поэтому переходим к тысячам
GoTo Thousands
'в случае если разряд "десятки миллионов" от 2 до 9, применяется массив Nums2 (двадцать - девяносто миллионов)
Case 2 To 9
decmil_txt = Nums2(decmil)
End Select
Select Case mil
Case 0
If decmil > 0 Then mil_txt = Nums1(mil) & "миллионов "
Case 1
mil_txt = Nums1(mil) & "миллион "
Case 2, 3, 4
mil_txt = Nums1(mil) & "миллиона "
Case 5 To 9
mil_txt = Nums1(mil) & "миллионов "
End Select
'Если отсутствуют "десятки" / "единицы" миллионов, используются сотни миллионов
If decmil = 0 And mil = 0 And sotmil <> 0 Then sotmil_txt = sotmil_txt & "миллионов "
'определяем сотни тысяч
Thousands:
sottys_txt = Nums3(sottys)
'проверяем тысячи
Select Case dectys
'в случае если разряд "десятки тысяч" равен одному, применяется массив Nums5 (десять - девятнадцать тысяч)
Case 1
tys_txt = Nums5(tys) & "тысяч "
'в случае 1 работа с тысячами завершена, поэтому переходим к единицам
GoTo Units
'в случае если разряд "десятки тысяч" от 2 до 9, применяется массив Nums2 (двадцать - девяносто тысяч)
Case 2 To 9
dectys_txt = Nums2(dectys)
End Select
Select Case tys
Case 0
If dectys > 0 Then tys_txt = Nums4(tys) & "тысяч "
Case 1
tys_txt = Nums4(tys) & "тысяча "
Case 2, 3, 4
tys_txt = Nums4(tys) & "тысячи "
Case 5 To 9
tys_txt = Nums4(tys) & "тысяч "
End Select
'Если отсутствуют десятки / "единицы" тысяч, используются сотни тысяч
If dectys = 0 And tys = 0 And sottys <> 0 Then sottys_txt = sottys_txt & "тысяч "
'определяем сотни
Units:
sot_txt = Nums3(sot)
'проверяем десятки
Select Case dec
Case 1
ed_txt = Nums5(ed)
GoTo Units_1
Case 2 To 9
dec_txt = Nums2(dec)
End Select
'определяем единицы
ed_txt = Nums1(ed)
Units_1:
sot_txt_1 = Nums3(sot_1)
'проверяем десятки
Select Case dec_1
Case 1
ed_txt_1 = Nums5(ed_1)
GoTo rrr
Case 2 To 9
dec_txt_1 = Nums2(dec_1)
End Select
'определяем единицы
ed_txt_1 = Nums1(ed_1)
rrr:
If sotbil_txt & decbil_txt & bil_txt & sotmil_txt & decmil_txt & mil_txt & sottys_txt & dectys_txt & tys_txt & sot_txt & dec_txt & ed_txt = "" Then
Joker = "ноль "
Else
Joker = sotbil_txt & decbil_txt & bil_txt & sotmil_txt & decmil_txt & mil_txt & sottys_txt & dectys_txt & tys_txt & sot_txt & dec_txt & ed_txt
End If
If Right(ed, 1) = 1 And Right(dec, 1) <> 1 Then Trump = "целая " Else Trump = "целых "
If sot_txt_1 & dec_txt_1 & ed_txt_1 = "" Then
Darth_Vader_1 = "ноль "
Else
Darth_Vader_1 = sot_txt_1 & dec_txt_1 & ed_txt_1
End If
If Right(Darth_Vader, 1) = 1 And Right(Darth_Vader, 2) <> 11 Then Death_star = "тысячная" Else Death_star = "тысячных"
'Выводим итоговую формулу, склеивая все получившиеся значения
If m = 0 Then
summa_pr = Znak & Joker & Trump & Emperor & Darth_Vader & " " & Death_star
Else
summa_pr = Znak & Joker & Trump & Emperor & Darth_Vader_1 & Death_star
End If
summa_pr = UCase(Left(summa_pr, 1)) & Mid(summa_pr, 2, Len(summa_pr) - 1)
СУММАПРОПИСЬЮ_П = summa_pr
End Function
'вспомогательная функция для выделения из числа разрядов
Private Function Class(m, i)
Class = Int(Int(m - (10 ^ i) * Int(m / (10 ^ i))) / 10 ^ (i - 1))
End Function
|