Я у себя в функции поверку на корректность исходной информации не делал, и какой должен быть результат для вышеперечисленных значений - #ЗНАЧ!? Все вышеперечисленные варианты не являются корректной прописью для числительных Настроить десятки и сотни путем умножения на 10 и 100 не составляет труда.
По ссылке на "Планету", которую я приводил есть вариант от ikki, в котором реализована проверка на корректность ввода
2AndreTM, Андрей, твоя функция чувствительна к лишним пробелам, добавляет дробные значения если есть двойной пробел или лишний пробел в конце текста
Цитата (M73568)
Скормил вашим функциям
Я у себя в функции поверку на корректность исходной информации не делал, и какой должен быть результат для вышеперечисленных значений - #ЗНАЧ!? Все вышеперечисленные варианты не являются корректной прописью для числительных Настроить десятки и сотни путем умножения на 10 и 100 не составляет труда.
По ссылке на "Планету", которую я приводил есть вариант от ikki, в котором реализована проверка на корректность ввода
2AndreTM, Андрей, твоя функция чувствительна к лишним пробелам, добавляет дробные значения если есть двойной пробел или лишний пробел в конце текстаMCH
Андрей, твоя функция чувствительна к лишним пробелам
Естественно. Мы же уже упоминали про "корректную пропись" Впрочем, я всё равно собирался сборку конечного числа внести в один цикл с парсингом, так что заодно исправил и это.
[vba]
Код
Function ToNumber(s As String) Dim i%, n1%, n3% a = Split(LCase(s)) ToNumber = 0 For i = LBound(a) To UBound(a) Select Case Left(a(i), 3) Case "" n1 = 0 Case "дес" n1 = 10 Case "сор" n1 = 40 Case "сто", "ста" n1 = 100 Case Else n1 = InStr(1, " од дв тр че пя ше се во де", Left(a(i), 2)) / 3 ' число If n1 > 0 Then If InStr(2, a(i), "над") > 0 Then n1 = n1 + 10 Else If InStr(2, a(i), "дц") > 0 Or InStr(1, a(i), "дес") > 0 Or _ InStr(1, a(i), "нос") Then n1 = n1 * 10 If InStr(1, a(i), "сти") > 0 Or InStr(1, a(i), "ста") > 0 Or _ InStr(1, a(i), "сот") Then n1 = n1 * 100 End If Else ' порядок n1 = InStr(1, " нр", Mid(a(i), 7, 1)) If n1 > 0 Then ToNumber = ToNumber + n3 * 1000 ^ n1 n3 = 0 n1 = 0 End If End If End Select n3 = n3 + n1 Next ToNumber = ToNumber + n3 End Function
[/vba]
---------------------- Для M73568, если есть желание
Если изменить определение порядка числительного на вот такое:
[vba]
Код
If n1 > 0 Then If n3 = 0 Then ToNumber = IIf(ToNumber = 0, 1, ToNumber) * 1000 ^ n1 Else ToNumber = ToNumber + n3 * 1000 ^ n1 End If n3 = 0 n1 = 0 End If f
[/vba]
то будет правильно вычисляться не только число, начинающееся с квалификатора ("тысяча сто"), но и квалификатор как множитель ("пять тысяч миллионов"). Что касается "сотен" и "десятков" как квалификаторов порядка - у Михаила это делается легко, у меня - потребует небольшого изменения алгоритма. С другой стороны, сейчас у меня "квалификатор" ищется по такому алгоритму, что может получаться очень интересный результат при использовании "неподходящих" слов: сравните, например, "двадцать арбузов", "двадцать один арбуз" и "двадцать два арбузана"
И было бы интересно посмотреть на то, как функции будут разбирать числительные с разными склонениями.
Цитата (MCH)
Андрей, твоя функция чувствительна к лишним пробелам
Естественно. Мы же уже упоминали про "корректную пропись" Впрочем, я всё равно собирался сборку конечного числа внести в один цикл с парсингом, так что заодно исправил и это.
[vba]
Код
Function ToNumber(s As String) Dim i%, n1%, n3% a = Split(LCase(s)) ToNumber = 0 For i = LBound(a) To UBound(a) Select Case Left(a(i), 3) Case "" n1 = 0 Case "дес" n1 = 10 Case "сор" n1 = 40 Case "сто", "ста" n1 = 100 Case Else n1 = InStr(1, " од дв тр че пя ше се во де", Left(a(i), 2)) / 3 ' число If n1 > 0 Then If InStr(2, a(i), "над") > 0 Then n1 = n1 + 10 Else If InStr(2, a(i), "дц") > 0 Or InStr(1, a(i), "дес") > 0 Or _ InStr(1, a(i), "нос") Then n1 = n1 * 10 If InStr(1, a(i), "сти") > 0 Or InStr(1, a(i), "ста") > 0 Or _ InStr(1, a(i), "сот") Then n1 = n1 * 100 End If Else ' порядок n1 = InStr(1, " нр", Mid(a(i), 7, 1)) If n1 > 0 Then ToNumber = ToNumber + n3 * 1000 ^ n1 n3 = 0 n1 = 0 End If End If End Select n3 = n3 + n1 Next ToNumber = ToNumber + n3 End Function
[/vba]
---------------------- Для M73568, если есть желание
Если изменить определение порядка числительного на вот такое:
[vba]
Код
If n1 > 0 Then If n3 = 0 Then ToNumber = IIf(ToNumber = 0, 1, ToNumber) * 1000 ^ n1 Else ToNumber = ToNumber + n3 * 1000 ^ n1 End If n3 = 0 n1 = 0 End If f
[/vba]
то будет правильно вычисляться не только число, начинающееся с квалификатора ("тысяча сто"), но и квалификатор как множитель ("пять тысяч миллионов"). Что касается "сотен" и "десятков" как квалификаторов порядка - у Михаила это делается легко, у меня - потребует небольшого изменения алгоритма. С другой стороны, сейчас у меня "квалификатор" ищется по такому алгоритму, что может получаться очень интересный результат при использовании "неподходящих" слов: сравните, например, "двадцать арбузов", "двадцать один арбуз" и "двадцать два арбузана"
И было бы интересно посмотреть на то, как функции будут разбирать числительные с разными склонениями.AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Четверг, 13.06.2013, 05:18
Ну я же не в порядке критики, а просто мне было интересно, да и в голове крутилась песенка "Арии", "Тысяча сто и смерть в лицо..." Просто результаты для значений отличающихся от контрольных различны для разных функций, вот например сегодня утром по радио услышал отрывок из мф "Карлсон который живёт на крыше", когда Малыш спрашивает "И даже за сто тысяч миллионов крон?", на работе скормил функциям эту цифру - результат просто песня, все три функции дают разный результат, как итог - "рекурсия рулит" и даёт самый правильный ответ
А вообще наверное стоит предусмотреть промежуточную функцию которая приводила бы разговорный вариант к строго математическому, а уж за тем передавать данным функциям
Цитата (AndreTM)
И было бы интересно посмотреть на то, как функции будут разбирать числительные с разными склонениями.
А что от склонения зависит числовое значение?
Цитата (AndreTM)
Для M73568, если есть желание smile
Ну я же не в порядке критики, а просто мне было интересно, да и в голове крутилась песенка "Арии", "Тысяча сто и смерть в лицо..." Просто результаты для значений отличающихся от контрольных различны для разных функций, вот например сегодня утром по радио услышал отрывок из мф "Карлсон который живёт на крыше", когда Малыш спрашивает "И даже за сто тысяч миллионов крон?", на работе скормил функциям эту цифру - результат просто песня, все три функции дают разный результат, как итог - "рекурсия рулит" и даёт самый правильный ответ
А вообще наверное стоит предусмотреть промежуточную функцию которая приводила бы разговорный вариант к строго математическому, а уж за тем передавать данным функциям
Цитата (AndreTM)
И было бы интересно посмотреть на то, как функции будут разбирать числительные с разными склонениями.
А что от склонения зависит числовое значение? M73568
Сообщение отредактировал M73568 - Четверг, 13.06.2013, 10:20
Теоретически - нет. А вот практически, предложенными функциями, да в различных падежах - тоже песня ещё та
Кстати, насчет "ста тысяч мильёнов", если уж правильно цитировать - то да, функции будут врать. А вот если слово будет в правильной форме, то моя, например (с вышеуказанным дополнением в расчёте порядка) - посчитает даже "миллион тысяч".
Цитата (M73568)
А что от склонения зависит числовое значение?
Теоретически - нет. А вот практически, предложенными функциями, да в различных падежах - тоже песня ещё та
Кстати, насчет "ста тысяч мильёнов", если уж правильно цитировать - то да, функции будут врать. А вот если слово будет в правильной форме, то моя, например (с вышеуказанным дополнением в расчёте порядка) - посчитает даже "миллион тысяч".AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Четверг, 13.06.2013, 11:00
Забыли в качестве числительных упомянуть: дюжина, полтина, четверть и т.п., а также приставки кило-, мега-, гига-, мил-, микро-, нано-
Цитата (M73568)
А вообще наверное стоит предусмотреть промежуточную функцию которая приводила бы разговорный вариант к строго математическому
Представляю данную функцию... может быть нужно чтобы еще и ошибки исправляла?
Есть определенные правила написания числительных, все корректные надстройки "сумма прописью" формируют пропись в соответствии с правилами русского языка. Недопустимо писать "миллион тысяча" для обозначения числа 1001000, нужно писать "один миллион одна тысяча"
Цитата (M73568)
Один стол четыре стула, табурет и окно в сад
И какое значение у данного "числительного"?
Забыли в качестве числительных упомянуть: дюжина, полтина, четверть и т.п., а также приставки кило-, мега-, гига-, мил-, микро-, нано-
Цитата (M73568)
А вообще наверное стоит предусмотреть промежуточную функцию которая приводила бы разговорный вариант к строго математическому
Представляю данную функцию... может быть нужно чтобы еще и ошибки исправляла?
Есть определенные правила написания числительных, все корректные надстройки "сумма прописью" формируют пропись в соответствии с правилами русского языка. Недопустимо писать "миллион тысяча" для обозначения числа 1001000, нужно писать "один миллион одна тысяча"MCH
Функции пропись2число() и пропись2число3() из 17-го сообщения не используют объектную модель MS Excel, поэтому они должны корректно работать в любой версии VBA (под Excel, под MS Word и др.), а также в VB. Не имею опыта работы с VBA под Word, поэтому не могу подсказать как "скормить" финкции исходные данные и получить ответ в Word.
Но стандартная конструкция: [vba]
Код
Sub main() MsgBox пропись2число3(InputBox("Введите числительное прописью")) End Sub
[/vba] нормально работает
Функции пропись2число() и пропись2число3() из 17-го сообщения не используют объектную модель MS Excel, поэтому они должны корректно работать в любой версии VBA (под Excel, под MS Word и др.), а также в VB. Не имею опыта работы с VBA под Word, поэтому не могу подсказать как "скормить" финкции исходные данные и получить ответ в Word.
Но стандартная конструкция: [vba]
Код
Sub main() MsgBox пропись2число3(InputBox("Введите числительное прописью")) End Sub