Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
1

Проценты прописью, некорректно возвращает целые

17.05.2019, 15:35. Показов 1037. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята здравствуйте, в инете нашел макрос прописью проценты но выводит не корректно, целые возвращает ((1,0 % (Один целая сотых процента) в день)), помогите поправить макрос. Заранее спасибо

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function MProzProp$(chislo#) 'проценты числом прописью
    Dim rub$, kop$, ed, des, sot, nadc, razr, i&, m$
    Dim mm
    If chislo >= 1E+15 Or chislo < 0 Then Exit Function
    sot = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
    des = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
    nadc = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
    ed = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ", "", "одна ", "две ")
    razr = Array("триллион ", "триллиона ", "триллионов ", "миллиард ", "миллиарда ", "миллиардов ", "миллион ", "миллиона ", "миллионов ", "тысяча ", "тысячи ", "тысяч ", "целая ", "целых ", "целых ")
    rub = Left(Format(chislo, "000000000000000.00"), 15)
    kop = Right(Format(chislo, "0.00"), 2)
    m = ""
    If CDbl(rub) = 0 Then m = "ноль "
    For i = 1 To Len(rub) Step 3
        If Mid(rub, i, 3) <> "000" Or i = Len(rub) - 2 Then
            m = m & sot(CInt(Mid(rub, i, 1))) & IIf(Mid(rub, i + 1, 1) = "1", nadc(CInt(Mid(rub, i + 2, 1))), _
                    des(CInt(Mid(rub, i + 1, 1))) & ed(CInt(Mid(rub, i + 2, 1)) + IIf(i = Len(rub) - 5 And CInt(Mid(rub, i + 2, 1)) < 3, 10, 0))) & _
                    IIf(Mid(rub, i + 1, 1) = "1" Or (Mid(rub, i + 2, 1) + 9) Mod 10 >= 4, razr(i + 1), IIf(Mid(rub, i + 2, 1) = "1", razr(i - 1), razr(i)))
        End If
    Next i
       If Mid(kop, i, 2) <> "00" Then
            mm = IIf(Mid(kop, 1, 1) = "1", nadc(CInt(Mid(kop, 1, 1))), des(CInt(Mid(kop, 1, 1))) & ed(CInt(Mid(kop, 2, 1))))
       End If
    MProzProp = UCase(Left(m, 1)) & Mid(m, 2) & mm & " сот" & IIf(kop \ 10 = 1 Or ((kop + 9) Mod 10) >= 4, "ых", IIf(kop Mod 10 = 1, "ая", "ых")) & " процента"
End Function
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2019, 15:35
Ответы с готовыми решениями:

Написать программу, которая возвращает сообщение о причитающейся сдаче прописью
Напишите программу, которая запрашивает стоимость покупки и сумму передаваемую пользователем...

Dlookup некорректно возвращает дату
Всем здравствуйте! Подскажите пожалуйста, в чем причина. В форме по событию, переменной Public D...

Модель GradientBoostingClassifier возвращает целые значение
Добрый день. Машинное обучение для меня тема новая, поэтому, может, я просто чего-то не понимаю. ...

Найти сумму двух денежных сумм заданных прописью, ответ вывести прописью
Приветствую форумчан, прошу момочь с задачей : Сложить две денежные суммы в рублях и копейках,...

3
6172 / 937 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
17.05.2019, 16:16 2
ASSEI, интересно, где Вы взяли эту реализацию?
Вопросы:
1. Обязательно нужен макрос (UDF) или можно на формулах сделать?
2. Проценты задаются как доля от единицы (т.е. 1% это 0,01) или нужно сразу прописать от дробного числа, без умножения на 100?
3. Сколько знаков после запятой необходимо (десятые, сотые, тысячные, десятитысячные и т.д.)?
4. Если число целое, например, 1%, то нужно писать "Один процент" без целых и десятых?
0
0 / 1 / 3
Регистрация: 18.10.2012
Сообщений: 662
17.05.2019, 16:26  [ТС] 3
по порядку:
Цитата Сообщение от m-ch Посмотреть сообщение
где Вы взяли эту реализацию?
- я уже не помню давно было, просто руки не доходили обратить внимание.
1. этот макрос переводит проценты из текстового поля на "лету" и записывает в ворд документ, думаю будет лучше что бы это был макрос
2. этот макрос переводит проценты из текстового поля в таком формате 1,0
3. самое большое что записываться буду это от 0,2 до 1,0% это может быть и 0,21 и 0,78 и 0,99
4. да вы именно так
0
6172 / 937 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
20.05.2019, 08:28 4
ASSEI, протестируйте
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Function MProcProp(chislo As Double) As String
    'Проценты прописью, Автор MCH (Михаил Ч.), май 2019
    Dim celoe As Double, drob As Double, razr As Long, m As String, celoe2 As Long, LenDrob As Long
    If chislo >= 1E+15 Or chislo < 0 Then Exit Function
    celoe = CDbl(Left(Format(chislo, "000000000000000.000"), 15))
    celoe2 = CLng(Right(Format(celoe, "0"), 2))
    drob = CLng(StrReverse(Right(Format(chislo, "000000000000000.000"), 3)))
    LenDrob = Len(CStr(drob))
    drob = CLng(StrReverse(drob))
    If drob = 0 Then
        m = MNumProp(CDbl(celoe)) & " процент" & IIf(celoe2 \ 10 = 1 Or ((celoe2 + 9) Mod 10) >= 4, "ов", IIf(celoe2 Mod 10 = 1, "", "а"))
    Else
        m = MNumProp(celoe, 1) & " цел" & IIf(celoe2 Mod 10 = 1 And (celoe2 \ 10) Mod 10 <> 1, "ая ", "ых ") & MNumProp(drob, 1)
        m = m & " " & Array("десят", "сот", "тысячн")(LenDrob - 1) & IIf(drob Mod 10 = 1 And drob \ 10 Mod 10 <> 1, "ая", "ых") & " процента"
    End If
    MProcProp = UCase(Left(m, 1)) & Mid(m, 2)
End Function
 
Function MNumProp(chislo As Double, Optional rod As Boolean = False) As String
    'Целое число прописью, Автор MCH (Михаил Ч.), модификация май 2019
    'rod = True - женский род, False - Мужской
    Dim sNum 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("триллион ", "триллиона ", "триллионов ", "миллиард ", "миллиарда ", "миллиардов ", "миллион ", "миллиона ", "миллионов ", "тысяча ", "тысячи ", "тысяч ", " ", " ", " ")
    
    sNum = Left(Format(chislo, "000000000000000"), 15)
    If CDbl(sNum) = 0 Then m = "ноль "
    For i = 1 To Len(sNum) Step 3
        If Mid(sNum, i, 3) <> "000" Or i = Len(sNum) - 2 Then
            m = m & sot(CInt(Mid(sNum, i, 1))) & IIf(Mid(sNum, i + 1, 1) = "1", nadc(CInt(Mid(sNum, i + 2, 1))), _
                    des(CInt(Mid(sNum, i + 1, 1))) & ed(CInt(Mid(sNum, i + 2, 1)) + IIf((i = Len(sNum) - 5 Or (i = Len(sNum) - 2 And rod = True)) And CInt(Mid(sNum, i + 2, 1)) < 3, 10, 0))) & _
                    IIf(Mid(sNum, i + 1, 1) = "1" Or (Mid(sNum, i + 2, 1) + 9) Mod 10 >= 4, razr(i + 1), IIf(Mid(sNum, i + 2, 1) = "1", razr(i - 1), razr(i)))
        End If
    Next i
    MNumProp = Trim(m)
End Function
Вложения
Тип файла: zip MProcProp.zip (20.1 Кб, 4 просмотров)
1
20.05.2019, 08:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2019, 08:28
Помогаю со студенческими работами здесь

Написать функцию, которая принимает массив 32-ых битных целых чисел и возвращает 16-ые битные целые числа
Доброго времени суток! Знаю, тема возможно избитая и есть на форуме. У меня в условиях задачи дан...

Дата прописью и сумма прописью
Господа, помогите!! Перерыл весь инет, скачал кучу прог и кодов но не разобрался ни в чем..(( Мне...

Найти целые и не целые части двух действительных чисел. Комментарии
#include &lt;iostream.h&gt; #include &lt;math.h&gt; void main() { double...

Создать функцию, которая возвращает массив в обратном порядке. Именно возвращает
Не могу никак создать функцию.

OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав)
Добрый день! В программе используется OpenEventLog, она возвращает нулевой дескриптор, вызванная...

Метод без проблем возвращает строку, но не возвращает класс
Здравствуйте! Уже сутки бьюсь с проблемой и не пойму вообще почему она возникла. Есть WCF-сервер и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru