Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
1

Словесное представление чисел

11.04.2014, 19:34. Показов 1677. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,
Есть строка, например "я купил хлеб за 23 рубля, сдача составляет 7 рублей". Подскажите, как выловить цифры из нее и заменить на слова? В итоге должно получиться "я купил хлеб за двадцать три рубля, сдача составляет семь рублей".
Спасибо за помощь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2014, 19:34
Ответы с готовыми решениями:

Словесное представление числа
Средствами текстового редактора создать файл с набором двузначных чисел. Разработать функцию,...

Словесное представление числа
как например из чилcа 288456,25 сделать 'двести восемьдесятвосемь тысяч двадцать пять копеек'...

Вывести словесное представление числа
Написать программу, которая принимает целое 3-хзначное число с клавиатуры и выводит словесное...

Словесное представление введенного возраста
var N, a, b: byte; begin writeln(' Введите возраст от 20 до 69:'); write(' '); ...

9
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.04.2014, 20:27 2
Код заготовки
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
 Private Function propis(numb As Long) As String
Select Case numb
Case 23
propis = "двадцать три"
Case 7
propis = "семь"
End Select
 End Function
  
 Private Sub Form_Load()
 Dim arrMyArray() As String
  Dim strMyString As String
  strMyString = "я купил хлеб за 23 рубля, сдача составляет 7 рублей"
  arrMyArray = Split(strMyString)
  
  For i = 0 To UBound(arrMyArray)
    If Val(arrMyArray(i)) Then
    arrMyArray(i) = propis(Val(arrMyArray(i)))
  End If
  strMyString = ""
  Next
   For i = 0 To UBound(arrMyArray)
   strMyString = strMyString & " " & arrMyArray(i)
  Next
  MsgBox strMyString
End Sub
Заготовка потому, что Function propis работает только с этими конкретными цифрами. В Интернетах полно готовых функций на VB6, корыте так и называются "Число прописью". Т.е. им на вход подаешь число, а они его переводят в пропись согласно русской грамматике.

P.S. Конечно можно развить и мою процедуру до рабочего состояния, только в конструкцию Select Case придется записать все возможные числа, что совершенно невозможно

Добавлено через 7 минут
Даже вот тут есть, только убрать вывод валюты -> Готовые решения и полезные коды на Visual Basic 6.0
2
es geht mir gut
11270 / 4752 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
11.04.2014, 20:28 3
Функция отсюда

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit
 
Private Sub Command1_Click()
    Dim SS, S As String, i As Integer
    S = InputBox("Ввод", "Ввод", "я купил хлеб за 23 рубля, сдача составляет 7 рублей")
    SS = Split(S)
    For i = 0 To UBound(SS)
        If IsNumeric(SS(i)) Then SS(i) = num2text_word(CLng(SS(i)))
    Next i
    MsgBox Join(SS)
End Sub
 
Function num2text_word(x As Long, Optional Lang As Long = 1049) As String
    With CreateObject("word.document")
       .Range.LanguageID = Lang
       .Fields.Add .Range, Type:=-1, Text:="=" & x & " \* cardtext"
        num2text_word = Replace(.Range.Text, vbCr, "")
       .Close 0
    End With
End Function
1
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.04.2014, 20:40 4
Лучший ответ Сообщение было отмечено Костяныч как решение

Решение

Готовые решения и полезные коды на Visual Basic 6.0

Если нет на компьютере MS Office
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
'
'       Число прописью
'       © JoraVoenyjHaker
'
Const s0 = "ноль"
Const s1 = "один два три четыре пять шесть семь восемь девять"
Const s2 = "одинадцать двенадцать тринадцать четырнадцать пятнадцать шестнадцать семнадцать восемнадцать девятнадцать"
Const s3 = "десять двадцать тридцать сорок пятьдесят шестьдесят семьдесят восемьдесят девяносто"
Const s4 = "сто двести триста четыреста пятьсот шестьсот семьсот восемьсот девятьсот"
Const s5 = "тысяча-тысячи-тысяч/" & _
"миллион/миллиард/триллион/" & _
"квадриллион/квинтиллион/секстиллион/" & _
"септиллион/октиллион/нониллион/" & _
"дециллион/андециллион/дуодециллион/" & _
"тредециллион/кваттордециллион/квиндециллион/" & _
"сексдециллион/септемдециллион/октодециллион" 'Наверное хватит )))
 Enum f_UpNu
    [Начало с заглавной буквы] = 1
    [Расставить запятые] = 2
 End Enum
 
Public Function UppercaseNumber$(ByVal Num$, Optional flag As f_UpNu, Optional Rekurs&)
    'Возвращаемое значение предложение словами от -10^60+1  до 10^60-1
    'Арг: Число текстом "1234..." без других знаков // Комбинируемый флаг // Текущая рекурсия
    Const r$ = "/", r1 = "-", pr$ = " "
    Dim l#, l1#, l2#, key1$, key2$, key3$, j$(), f&
    Dim Sborka$
    
    If Rekurs = 0 Then
        Num = Replace(Num, pr, "") 'Удалить возможные пробелы
        If Num = 0 Then
            UppercaseNumber = s0: Exit Function
        ElseIf Num < 0 Then
            Num = Mid(Num, 2)
            Sborka = "минус "
        End If
    End If
    key1 = Num
    Do
        l = Len(key1)
        Select Case l
        Case 1
            l1 = Mid(key1, 1, 1)
            If l1 > 0 Then Sborka = Sborka & Split(s1)(l1 - 1) & pr
            key1 = Mid(key1, 2)
        Case 2
            If key1 > 10 And key1 < 20 Then
                l1 = Mid(key1, 2, 1)
                Sborka = Sborka & Split(s2)(l1 - 1) & pr
                key1 = Mid(key1, 3)
            Else
                l1 = Mid(key1, 1, 1)
                If l1 > 0 Then Sborka = Sborka & Split(s3)(l1 - 1) & pr
                key1 = Mid(key1, 2)
            End If
        Case 3
            l1 = Mid(key1, 1, 1)
            If l1 > 0 Then Sborka = Sborka & Split(s4)(l1 - 1) & pr
            key1 = Mid(key1, 2)
        Case Is > 3
            Do
                l1 = l Mod 3
                If l1 Then
                    key2 = Mid(key1, 1, l1): key1 = Mid(key1, l1 + 1)
                Else: key2 = Mid(key1, 1, 3): key1 = Mid(key1, 4)
                End If
                key3 = UppercaseNumber(key2, flag, Rekurs + 1)
                l = Len(key1): l2 = Fix(l / 3) - 1
                
                If key3 <> s0 Then
                    Sborka = Sborka & key3
                    If Right$(key2, 2) > 10 And Right$(key2, 2) < 20 Then key2 = 0
                    If l2 = 0 Then
                        j = Split(Split(s5, r)(l2), r1)
                        Select Case key2 Mod 10
                        Case 1: Sborka = Sborka & j(0) & pr
                        Case 2, 3, 4: Sborka = Sborka & j(1) & pr
                        Case Else: Sborka = Sborka & j(2) & pr
                        End Select
                        Sborka = Replace(Sborka, "один тысяча", "одна тысяча")
                        Sborka = Replace(Sborka, "два тысячи", "две тысячи")
                    Else
                        j = Split("0 а ов")
                        j(0) = Split(s5, r)(l2)
                        Select Case key2 Mod 10
                        Case 1: Sborka = Sborka & j(0) & pr
                        Case 2, 3, 4: Sborka = Sborka & j(0) & j(1) & pr
                        Case Else: Sborka = Sborka & j(0) & j(2) & pr
                        End Select
                    End If
                    If flag >= [Расставить запятые] Then Sborka = RTrim(Sborka) & ", "
                End If
            Loop While l > 3
        End Select
    Loop While l
    
    If Rekurs = 0 Then
        Num = flag Mod 4
        While Num
            Select Case Num
            Case Is >= [Расставить запятые]
                Num = Num - [Расставить запятые]
            Case Is >= [Начало с заглавной буквы]
                Num = Num - [Начало с заглавной буквы]
                Mid(Sborka, 1, 1) = UCase(Mid(Sborka, 1, 1))
            End Select
        Wend
    End If
    UppercaseNumber = Sborka
End Function
 
 
 Private Sub Form_Load()
 Dim arrMyArray() As String
  Dim strMyString As String
  strMyString = "я купил хлеб за 24 рубля, сдача составляет 9 рублей"
  arrMyArray = Split(strMyString)
  
  For i = 0 To UBound(arrMyArray)
    If Val(arrMyArray(i)) Then
    arrMyArray(i) = UppercaseNumber$(Val(arrMyArray(i))) '
  End If
  strMyString = ""
  Next
   For i = 0 To UBound(arrMyArray)
   strMyString = strMyString & " " & arrMyArray(i)
  Next
  MsgBox strMyString
End Sub
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.04.2014, 07:42  [ТС] 5
Pro_grammer, а что за конструкция на строчках 17-20. Копирую её, указывает на ошибки "bracketed identifier is missing closing ']'"
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.04.2014, 08:27 6
Цитата Сообщение от Костяныч Посмотреть сообщение
конструкция на строчках 17-20.
Обычное перечисление и определение значения его элементов.
У меня работает без ошибок на Vb6.
JoraVoenyjHaker оригинально поступил для наглядности, но можно пожертвовать, заменив на цифры.
Т.о. Функция будет определена так
UppercaseNumber$(ByVal Num$, Optional flag , Optional Rekurs&)
в тексте слова заменить числами
[Начало с заглавной буквы] на 1
[Расставить запятые] на 2

ну и конструкцию на строчках 17-20 удалить.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.04.2014, 09:24  [ТС] 7
Цитата Сообщение от Pro_grammer Посмотреть сообщение
UppercaseNumber$(ByVal Num$, Optional flag , Optional Rekurs&)
а Optional flag так и оставить? у меня ругается на flag, говорит не ясный параметр.

Добавлено через 2 минуты
работаю в ms visual studio
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.04.2014, 10:19 8
Цитата Сообщение от Костяныч Посмотреть сообщение
Optional flag так и оставить?
Тип надо обозначить!
Visual Basic
1
Optional flag As Integer
1
Заблокирован
12.04.2014, 10:23 9
Цитата Сообщение от Костяныч Посмотреть сообщение
работаю в ms visual studio
Версию уточните. Если новее 1998 г., то вам другой раздел нужен - https://www.cyberforum.ru/vb-net/
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
12.04.2014, 10:28  [ТС] 10
Не могу найти vb6 на win8, у всех ошибки вылетают. Перейду на .Net. Спасибо за помощь.
0
12.04.2014, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2014, 10:28
Помогаю со студенческими работами здесь

Вывести словесное представление числа
В общем, есть две задачи, которые не как не могу понять. 1)Ввести натуральное число n (n&gt;99)....

Словесное представление числа в диапазоне 0 - 1000
Дано натуральное число (до 1000). Составить программу записи этого числа словами: На русском языке.

Словесное представление численных значений ячеек БД
Я подключила базу к с# Высвечивает таблицу. Но значения цифрами! Как сделать чтоб высвечивало...

Заменить число на его словесное представление
Добрый день, Есть строка, например &quot;я купил хлеб за 23 рубля, сдача составляет 7 рублей&quot;....


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

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