Страницы: 1 2 След.
RSS
Число прописью с прописью тысячных долей
 
Здравствуйте, на просторах полно макросов типа пропись числа, пропись суммы и т.д. но я не могу найти нужного, а необходимо так
125,037 - сто двадцать пять целых тридцать семь тысячных
41,113 - сорок одна целая сто тринадцать тысячных
0,008 - ноль целых восемь тысячных

Помогите кто чем может, или куда копать...
Изменено: vikttur - 03.06.2021 08:48:36
 
edkudin,
нашел в какой-то надстройке
Код
Function ЧислоПрописью(число As Double) As String

' Ограничиваем квадриллионами
If число >= 1E+18 Then
    ЧислоПрописью = "ОШИБКА: Слишком большое число"
    Exit Function
End If

Dim numWords As String
numWords = ""

' Определение знака числа
If число = 0 Then
    ЧислоПрописью = "ноль"
    Exit Function
ElseIf число < 0 Then
    numWords = "минус "
    число = число * -1
End If

If число < 1 Then numWords = numWords & "ноль "

Dim arrN(1) As String, strNum As String

'==================================================================
' Разделение числа на целую и дробную части

strNum = Format(число, "000000000000000000.######")

Dim i As Integer
i = InStr(1, strNum, ",") + InStr(1, strNum, ".")

arrN(0) = Mid(strNum, 1, i - 1)
arrN(1) = Mid(strNum, i + 1)

strNum = ""

'==================================================================
' Разделение частей на разряды

Dim digs(0 To 7, 1 To 5) As String  ' массив разрядов: _
                                    1 столбец       - число в виде строки _
                                    2 - 4 столбецы  - название разряда _
                                    5 столбец       - женский род для рязряда

Select Case Len(arrN(1))
    Case 6
        digs(0, 1) = Right(arrN(1), 3)        ' млн. доли
        digs(1, 1) = Left(arrN(1), 3)         ' тыс. доли
        
        digs(0, 2) = "миллионная"
        digs(0, 3) = "миллионных"
        digs(0, 4) = "миллионных"
        digs(0, 5) = "1"
    Case 5
        digs(0, 1) = Right(arrN(1), 3)        ' стотыс. доли
        digs(1, 1) = "0" & Left(arrN(1), 2)   ' сотые доли
        
        digs(0, 2) = "стотысячная"
        digs(0, 3) = "стотысячных"
        digs(0, 4) = "стотысячных"
        digs(0, 5) = "1"
    Case 4
        digs(0, 1) = Right(arrN(1), 3)        ' десятитыс. доли
        digs(1, 1) = "00" & Left(arrN(1), 1)  ' десятые
        
        digs(0, 2) = "десятитысячная"
        digs(0, 3) = "десятитысячных"
        digs(0, 4) = "десятитысячных"
        digs(0, 5) = "1"
    Case 3
        digs(0, 1) = arrN(1)                  ' тыс. доли
        digs(0, 2) = "тысячная"
        digs(0, 3) = "тысячных"
        digs(0, 4) = "тысячных"
        digs(0, 5) = "1"
    Case 2
        digs(0, 1) = "0" & arrN(1)            ' сотые доли
        digs(0, 2) = "сотая"
        digs(0, 3) = "сотых"
        digs(0, 4) = "сотых"
        digs(0, 5) = "1"
    Case 1
        digs(0, 1) = "00" & arrN(1)           ' десятые доли
        digs(0, 2) = "десятая"
        digs(0, 3) = "десятых"
        digs(0, 4) = "десятых"
        digs(0, 5) = "1"
End Select

digs(2, 1) = Right(arrN(0), 3)            ' до тысячи (не вкл.)
digs(3, 1) = Left(Right(arrN(0), 6), 3)   ' тысячи
digs(4, 1) = Left(Right(arrN(0), 9), 3)   ' млн
digs(5, 1) = Left(Right(arrN(0), 12), 3)  ' млрд
digs(6, 1) = Left(Right(arrN(0), 15), 3)  ' трлн
digs(7, 1) = Left(Right(arrN(0), 18), 3)  ' квадрлн

'________

If Len(arrN(1)) > 0 Then
    digs(1, 2) = "тысяча "
    digs(1, 3) = "тысячи "
    digs(1, 4) = "тысяч "
    digs(1, 5) = "1"
    digs(2, 2) = "целая "
    digs(2, 3) = "целых "
    digs(2, 4) = "целых "
    digs(2, 5) = "1"
End If

digs(3, 2) = "тысяча "
digs(3, 3) = "тысячи "
digs(3, 4) = "тысяч "
digs(3, 5) = "1"
digs(4, 2) = "миллион "
digs(4, 3) = "миллиона "
digs(4, 4) = "миллионов "
digs(5, 2) = "миллиард "
digs(5, 3) = "миллиарда "
digs(5, 4) = "миллиардов "
digs(6, 2) = "триллион "
digs(6, 3) = "триллиона "
digs(6, 4) = "триллионов "
digs(7, 2) = "квадриллион "
digs(7, 3) = "квадриллиона "
digs(7, 4) = "квадриллионов "


Erase arrN

'==================================================================
' Перевод разрядов в текст

Dim N As Byte, tx As String

For i = 7 To 0 Step -1
    
    If digs(i, 1) = "" Then GoTo NextFor
    
    N = CByte(Left(digs(i, 1), 1))
    
    Select Case N
        Case 9: tx = "девятьсот "
        Case 8: tx = "восемьсот "
        Case 7: tx = "семьсот "
        Case 6: tx = "шестьсот "
        Case 5: tx = "пятьсот "
        Case 4: tx = "четыреста "
        Case 3: tx = "триста "
        Case 2: tx = "двести "
        Case 1: tx = "сто "
        Case Else: tx = ""
    End Select
    
    N = CByte(Right(digs(i, 1), 2))
    
    Select Case N
        Case 10: tx = tx & "десять ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 11: tx = tx & "одиннадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 12: tx = tx & "двенадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 13: tx = tx & "тринадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 14: tx = tx & "четырнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 15: tx = tx & "пятнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 16: tx = tx & "шестнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 17: tx = tx & "семнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 18: tx = tx & "восемнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 19: tx = tx & "девятнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case Is >= 90: tx = tx & "девяносто "
        Case Is >= 80: tx = tx & "восемьдесят "
        Case Is >= 70: tx = tx & "семьдесят "
        Case Is >= 60: tx = tx & "шестьдесят "
        Case Is >= 50: tx = tx & "пятьдесят "
        Case Is >= 40: tx = tx & "сорок "
        Case Is >= 30: tx = tx & "тридцать "
        Case Is >= 20: tx = tx & "двадцать "
    End Select
    
    N = CByte(Right(digs(i, 1), 1))
    
    Select Case N
        Case 1:
                If digs(i, 5) = "" Then tx = tx & "один " Else tx = tx & "одна "
                digs(i, 4) = digs(i, 2)
        Case 2:
                If digs(i, 5) = "" Then tx = tx & "два " Else tx = tx & "две "
                digs(i, 4) = digs(i, 3)
        Case 3:
                tx = tx & "три "
                digs(i, 4) = digs(i, 3)
        Case 4:
                tx = tx & "четыре "
                digs(i, 4) = digs(i, 3)
        Case 5: tx = tx & "пять "
        Case 6: tx = tx & "шесть "
        Case 7: tx = tx & "семь "
        Case 8: tx = tx & "восемь "
        Case 9: tx = tx & "девять "
    End Select
        
    numWords = numWords & IIf(tx = "" And i <> 2, "", tx & digs(i, 4))

NextFor:
Next i

N = Empty: tx = "": Erase digs

' Вывод результата
ЧислоПрописью = numWords
End Function
Изменено: evgeniygeo - 02.06.2021 05:56:59
 
Цитата
edkudin написал:
Помогите кто чем может, или куда копать
edkudin, в библиотеке функций есть такая функция.
 
используйте ПРОПИС
Код
=ПРОПИС(ЦЕЛОЕ(A5);1;"0-целых .1-целая .2-целых") & СТРОЧН(ПРОПИС(ОКРУГЛ(ОСТАТ(A5;1)*1000;);1;"0-тысячных .1-тысячная .2-тысячных"))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Помучил, спасибо за помощь, возникли вопросы:
evgeniygeo ваша функция почему-то категорически отказывается работать у меня... эксель её вообще не видит
Evgenyy с вашей библиотекой творится что-то странное, через секунду после запуска её растягивает на весь экран и даже за его пределы и зависает эксель, если аварийно завершаю, то при повторном открытии происходит то-же, но вылетает в дебаг с ошибками. Кроме того напрочь сносит ленту с командами причем по умолчанию, теперь любой файл открывается без панелей с командами и их приходится все восстанавливать вручную. (скрины прилагаю)
Ігор Гончаренко ваш код работает, но не могу победить что-бы начинал с маленькой буквы... что я не могу найти?
 
edkudin,
посмотрите пример, Вы точно все правильно делали?
Изменено: evgeniygeo - 03.06.2021 05:48:02
 
edkudin, скопировал себе код из 2-го сообщения, все работает нормально или даже на отлично, сверял с вашими числами из вашего первого сообщения — результат работы функции точно соответствует запросу с первого сообщения.

P.S. Функция понравилась, взял себе в библиотеку.
Изменено: DANIKOLA - 03.06.2021 07:50:22
 
Для коллекции, реализация без макросов
 
Уважаемые МСН и evgeniygeo, да заработало, но не так как надо.  У меня всегда доли ТЫСЯЧНЫЕ, и если в примере 5,200 то и макрос должен писать пять целых двести тысячных, а у вас пишет две десятых
а вот у Ігор Гончаренко пишет правильно
Кроме того,  evgeniygeo, а почему у вас формулы введены через массив?
Изменено: edkudin - 03.06.2021 13:22:28
 
Цитата
edkudin написал:
а вот у Ігор Гончаренко пишет правильно
Проверьте число 2,9995
Исправить формулу, чтобы писало правильно - не сложно
Изменено: MCH - 03.06.2021 14:20:01
 
а зачем мне проверять с десятитысячными? у меня только тысячные
вот примерно так
111,001- сто одиннадцать целых одна тысячная
5,200 - пять целых двести тысячных
1,010 - одна целая десять тысячных
0,001 - ноль целых одна тысячная
0,100 - ноль целых сто тысячных...
и т.д.
 
Цитата
edkudin написал:
а зачем мне проверять с десятитысячными? у меня только тысячные
Вы наверное не поняли, про какие ошибки я писал
2,9995 - Две целыходна тысяча тысячных

1. в формуле не указан пробел после "...2-целых"
2. может не правильно округлить до 3х знаков после запятой, если значение содержит больше 3х знаков

PS: Про то, что нужно именно 3 знака после запятой (всегда тысячные) из стартового сообщения не понятно
Изменено: MCH - 03.06.2021 14:39:09
 
Цитата
edkudin: 0,100 - ноль целых сто тысячных...
тогда возникает вопрос, а почему не "тысяча десятитысячных", "десять тысяч стотысячных" и так далее???
Если после доли числа идут ноли, то хвост отсекается до значащих и 0,100 это "ноль целых, одна десятая" - зачем вам такие извращения?
Изменено: Jack Famous - 03.06.2021 14:50:46
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
edkudin,
тупо конечно, но так?
Код
Function ЧислоПрописью(число As Double) As String
 
' Ограничиваем квадриллионами
If число >= 1E+18 Then
    ЧислоПрописью = "ОШИБКА: Слишком большое число"
    Exit Function
End If
 
Dim numWords As String
numWords = ""
 
' Определение знака числа
If число = 0 Then
    ЧислоПрописью = "ноль"
    Exit Function
ElseIf число < 0 Then
    numWords = "минус "
    число = число * -1
End If
 
If число < 1 Then numWords = numWords & "ноль "
 
Dim arrN(1) As String, strNum As String
 
'==================================================================
' Разделение числа на целую и дробную части
 
strNum = Format(число, "000000000000000000.000")
 
Dim i As Integer
i = InStr(1, strNum, ",") + InStr(1, strNum, ".")
 
arrN(0) = Mid(strNum, 1, i - 1)
arrN(1) = Mid(strNum, i + 1)
 
strNum = ""
 
'==================================================================
' Разделение частей на разряды
 
Dim digs(0 To 7, 1 To 5) As String  ' массив разрядов: _
                                    1 столбец       - число в виде строки _
                                    2 - 4 столбецы  - название разряда _
                                    5 столбец       - женский род для рязряда
 
Select Case Len(arrN(1))
    Case 6
        digs(0, 1) = Right(arrN(1), 3)        ' млн. доли
        digs(1, 1) = Left(arrN(1), 3)         ' тыс. доли
         
        digs(0, 2) = "миллионная"
        digs(0, 3) = "миллионных"
        digs(0, 4) = "миллионных"
        digs(0, 5) = "1"
    Case 5
        digs(0, 1) = Right(arrN(1), 3)        ' стотыс. доли
        digs(1, 1) = "0" & Left(arrN(1), 2)   ' сотые доли
         
        digs(0, 2) = "стотысячная"
        digs(0, 3) = "стотысячных"
        digs(0, 4) = "стотысячных"
        digs(0, 5) = "1"
    Case 4
        digs(0, 1) = Right(arrN(1), 3)        ' десятитыс. доли
        digs(1, 1) = "00" & Left(arrN(1), 1)  ' десятые
         
        digs(0, 2) = "десятитысячная"
        digs(0, 3) = "десятитысячных"
        digs(0, 4) = "десятитысячных"
        digs(0, 5) = "1"
    Case 3
        digs(0, 1) = arrN(1)                  ' тыс. доли
        digs(0, 2) = "тысячная"
        digs(0, 3) = "тысячных"
        digs(0, 4) = "тысячных"
        digs(0, 5) = "1"
    Case 2
        digs(0, 1) = "0" & arrN(1)            ' сотые доли
        digs(0, 2) = "сотая"
        digs(0, 3) = "сотых"
        digs(0, 4) = "сотых"
        digs(0, 5) = "1"
    Case 1
        digs(0, 1) = "00" & arrN(1)           ' десятые доли
        digs(0, 2) = "десятая"
        digs(0, 3) = "десятых"
        digs(0, 4) = "десятых"
        digs(0, 5) = "1"
End Select
 
digs(2, 1) = Right(arrN(0), 3)            ' до тысячи (не вкл.)
digs(3, 1) = Left(Right(arrN(0), 6), 3)   ' тысячи
digs(4, 1) = Left(Right(arrN(0), 9), 3)   ' млн
digs(5, 1) = Left(Right(arrN(0), 12), 3)  ' млрд
digs(6, 1) = Left(Right(arrN(0), 15), 3)  ' трлн
digs(7, 1) = Left(Right(arrN(0), 18), 3)  ' квадрлн
 
'________
 
If Len(arrN(1)) > 0 Then
    digs(1, 2) = "тысяча "
    digs(1, 3) = "тысячи "
    digs(1, 4) = "тысяч "
    digs(1, 5) = "1"
    digs(2, 2) = "целая "
    digs(2, 3) = "целых "
    digs(2, 4) = "целых "
    digs(2, 5) = "1"
End If
 
digs(3, 2) = "тысяча "
digs(3, 3) = "тысячи "
digs(3, 4) = "тысяч "
digs(3, 5) = "1"
digs(4, 2) = "миллион "
digs(4, 3) = "миллиона "
digs(4, 4) = "миллионов "
digs(5, 2) = "миллиард "
digs(5, 3) = "миллиарда "
digs(5, 4) = "миллиардов "
digs(6, 2) = "триллион "
digs(6, 3) = "триллиона "
digs(6, 4) = "триллионов "
digs(7, 2) = "квадриллион "
digs(7, 3) = "квадриллиона "
digs(7, 4) = "квадриллионов "
 
 
Erase arrN
 
'==================================================================
' Перевод разрядов в текст
 
Dim N As Byte, tx As String
 
For i = 7 To 0 Step -1
     
    If digs(i, 1) = "" Then GoTo NextFor
     
    N = CByte(Left(digs(i, 1), 1))
     
    Select Case N
        Case 9: tx = "девятьсот "
        Case 8: tx = "восемьсот "
        Case 7: tx = "семьсот "
        Case 6: tx = "шестьсот "
        Case 5: tx = "пятьсот "
        Case 4: tx = "четыреста "
        Case 3: tx = "триста "
        Case 2: tx = "двести "
        Case 1: tx = "сто "
        Case Else: tx = ""
    End Select
     
    N = CByte(Right(digs(i, 1), 2))
     
    Select Case N
        Case 10: tx = tx & "десять ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 11: tx = tx & "одиннадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 12: tx = tx & "двенадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 13: tx = tx & "тринадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 14: tx = tx & "четырнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 15: tx = tx & "пятнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 16: tx = tx & "шестнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 17: tx = tx & "семнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 18: tx = tx & "восемнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case 19: tx = tx & "девятнадцать ": digs(i, 1) = Left(digs(i, 1), 2) & "0"
        Case Is >= 90: tx = tx & "девяносто "
        Case Is >= 80: tx = tx & "восемьдесят "
        Case Is >= 70: tx = tx & "семьдесят "
        Case Is >= 60: tx = tx & "шестьдесят "
        Case Is >= 50: tx = tx & "пятьдесят "
        Case Is >= 40: tx = tx & "сорок "
        Case Is >= 30: tx = tx & "тридцать "
        Case Is >= 20: tx = tx & "двадцать "
    End Select
     
    N = CByte(Right(digs(i, 1), 1))
     
    Select Case N
        Case 1:
                If digs(i, 5) = "" Then tx = tx & "один " Else tx = tx & "одна "
                digs(i, 4) = digs(i, 2)
        Case 2:
                If digs(i, 5) = "" Then tx = tx & "два " Else tx = tx & "две "
                digs(i, 4) = digs(i, 3)
        Case 3:
                tx = tx & "три "
                digs(i, 4) = digs(i, 3)
        Case 4:
                tx = tx & "четыре "
                digs(i, 4) = digs(i, 3)
        Case 5: tx = tx & "пять "
        Case 6: tx = tx & "шесть "
        Case 7: tx = tx & "семь "
        Case 8: tx = tx & "восемь "
        Case 9: tx = tx & "девять "
    End Select
         
    numWords = numWords & IIf(tx = "" And i <> 2, "", tx & digs(i, 4))
 
NextFor:
Next i
 
N = Empty: tx = "": Erase digs
 
' Вывод результата
ЧислоПрописью = numWords
End Function

Изменено: evgeniygeo - 04.06.2021 06:52:56
 
Цитата
Jack Famous написал:
зачем вам такие извращения?
Не знаю как у "гражданских", а у "военных" после последних обновлялок 1С и фиг его знает ещё чего, инвентаризационные описи выкатываются с такими данными:
если стоимость 67,44 шестьдесят семь рублей 44 копейки (копейки цифрами и слово копейки целиком)
если мат.средства то учет до тысячных, и даже если целое число то так 44,000 сорок четыре целых ноль тысячных, и всегда три знака после запятой, включая нули.
Не я придумал, но приходится подстраиваться, и часть ведомостей делается в экселе, вот там и нужны такие "извращения".
 
Цитата
Jack Famous написал:
Если после доли числа идут ноли, то хвост отсекается до значащих и 0,100 это "ноль целых, одна десятая"
если эксель по умолчанию не отображает последующие нули это совсем не означает, что они не нужны; 0,1 означает что-то между 0,0 и 0,2; 0,100 что-то между 0,099 и 0,101 - почувствуй разницу
Пы сы за такие разговоры метрологи и удавить могут...
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
evgeniygeo написал:
тупо конечно, но так?
почему тупо, попробовал вроде всё правильно, но вопрос открытый почему формула введена как формула массива? что это даёт и что возможно будет если её вводить просто через энтер?
 
Цитата
edkudin написал:
и всегда три знака после запятой, включая нули.
Я обращал Ваше внимание, что если в ячейке будет записано число 2,9995, при этом отображаться будет только три значащих цифры после запятой соответственно отображаться будет число 3,000 то запись "Две целыходна тысяча тысячных" не верная, должно быть "Три целых ноль тысячных"
 
edkudin,
потому что с точки зрения математики это тупо  :)
Цитата
edkudin написал:
почему тупо
а попробовать самостоятельно совсем лень?
Цитата
edkudin написал:
если её вводить просто через энтер
Изменено: evgeniygeo - 04.06.2021 08:45:55
 
бухучёт и математика живут на совсем разных планетах, то у них округление не как у всех, то год 360 дней, то ещё что...

нет, не лень, я и попробовал, и почему то всё равно считает и если число меняю тоже пересчитывает... вот и не могу понять что массив даёт
Изменено: edkudin - 04.06.2021 08:57:27
 
Цитата
buchlotnik: если эксель по умолчанию не отображает последующие нули это совсем не означает, что они не нужны
интересно, где это ты увидел хоть слово про отображение числа в значении "видимое округление". Если после 15го знака есть НЕнули, то технически, это на вот эту мааааленькую разницу, но ДРУГОЕ число и в 99% случаев это тоже самое, что ТАКОЕ ЖЕ ЧИСЛО (достаточная точность). Я же писал просто про НУЛИ, а не про 10 нулей и единичку после них - тут ты можешь хоть тысячу таких написать и никак не изменишь ЗНАЧЕНИЕ числа, и именно поэтому
Цитата
buchlotnik: 0,1 означает что-то между 0,0 и 0,2
— это глупость полнейшая, т.к. в жизни 0,1 это (сюрприз) 0,1, а уж то, что это результат округления явного или скрытого - это про другое

Про копейки немного другая история - тут 2 единицы измерения - для целых (рубли) и для десятичной части (копейки)
Так как в 1 рубле 100 копеек (так решили - это правило), то 0,10 р это хоть и 10 копеек, но ВСЕГДА 0,1 РУБЛЯ
Изменено: Jack Famous - 04.06.2021 09:22:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
[0,1 означает что-то между 0,0 и 0,2] — это глупость полнейшая
Закралось сомнение, что у тебя все в порядке с пониманием ряда чисел )

0,1 - это одна десятая, 10 сотых, 100 тысячных... Если надо - 10000 стотысячных )
Все зависит от правил, принятых при определенных измерениях.
Изменено: vikttur - 04.06.2021 10:11:32
 
Протестируйте еще эту UDF на 2 десятка строк
Код
Function MNumProp(chislo As Double) As String
    Dim num As String, ed, des, sot, nadc, razr, i As Long, m As String
    If chislo >= 1E+15 Or chislo < 0 Then Exit Function
    
    sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
    des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
    nadc = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
    ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ", "", "одна ", "две ")
    razr = Array("триллион ", "триллиона ", "триллионов ", "миллиард ", "миллиарда ", "миллиардов ", "миллион ", "миллиона ", "миллионов ", "тысяча ", "тысячи ", "тысяч ", "целая ", "целых ", "целых ", "тысячная", "тысячных", "тысячных")
    
    num = Left(Format(chislo * 1000, "000000000000000000"), 18)
    If CDbl(num) < 1000 Then m = "ноль "
    For i = 1 To Len(num) Step 3
        If Mid(num, i, 3) = "000" And i = Len(num) - 2 Then m = m & "ноль "
        If Mid(num, i, 3) <> "000" Or i >= Len(num) - 5 Then
            m = m & sot(CInt(Mid(num, i, 1))) & IIf(Mid(num, i + 1, 1) = "1", nadc(CInt(Mid(num, i + 2, 1))), _
                    des(CInt(Mid(num, i + 1, 1))) & ed(CInt(Mid(num, i + 2, 1)) + IIf(i >= Len(num) - 8 And CInt(Mid(num, i + 2, 1)) < 3, 10, 0))) & _
                    IIf(Mid(num, i + 1, 1) = "1" Or (Mid(num, i + 2, 1) + 9) Mod 10 >= 4, razr(i + 1), IIf(Mid(num, i + 2, 1) = "1", razr(i - 1), razr(i)))
        End If
    Next i
    MNumProp = UCase(Left(m, 1)) & Mid(m, 2)
End Function
 
Цитата
vikttur: Закралось сомнение, что у тебя все в порядке с пониманием ряда чисел
я не про то, что оно между 0 и 0,2 - это правда, я про то что ЧТО-ТО между  :D по-моему, вполне однозначное число
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
ЧТО-ТО между
да ради бога - ЧИСЛО между 0,0 и 0,2; а 0,100 - ЧИСЛО между 0,099 и 0,101 - сути-то не меняет
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Миш, мы опять о разном)) я - про то, что это КОНКРЕТНОЕ число, а ты про то, что это ЧТО-ТО МЕЖДУ
И вот как раз ЧТО-ТО МЕЖДУ 2мя числами — это бесконечный ряд, если нет ограничения на точность  :D
Предлагаю закрыть тему (в смысле обсуждение)  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
МЕЖДУ 2мя числами — это бесконечный ряд
это из свойств действительных чисел:
между любыми двумя бесконечно близкими между собой действительными числами находится бесконечное множество других действительных чисел
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, именно это я и имел ввиду
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
это бесконечный ряд
именно, только границы у рядов разные
Цитата
Jack Famous написал:
Предлагаю закрыть тему
да как скажете
Изменено: buchlotnik - 04.06.2021 11:51:11
Соблюдение правил форума не освобождает от модераторского произвола
 
Господа, товарищи... ну хоть кто-то объясните непутёвому в чём разница в данном случае между простым вводом и массивным, мучил и так и так, оно работает... но ведь неспроста evgeniygeo массивно вводил, что-то оно же должно давать... а то окажется на простых примерах работает а когда в нормальную ведомость вставлю перестанет...
МСН потестил вашу удф-ку, всё хорошо, пишет правильно.
Изменено: edkudin - 04.06.2021 13:41:24
Страницы: 1 2 След.
Наверх