Форумы HiProg.com - MS ACCESS, VBA, VB

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

ник: Lukas

Function InsertSpaceBetweenGroupSimbols3(ByVal s$) As String
    Dim i As Long
    Dim grp As Long
    
    grp = 0
    For i = Len(s) To 1 Step -1
        Select Case Asc(Mid(s, i))
            Case 97 To 122, 65 To 90, 192 To 255 'буковки аглицкие, 192 To 255 'русские
                If grp = 2 Or grp = 3 Then s = Left$(s, i) & " " & Mid$(s, i + 1)
                grp = 1
            Case 48 To 57 'цифирки
                If grp = 1 Or grp = 3 Then s = Left$(s, i) & " " & Mid$(s, i + 1)
                grp = 2
            Case 32 'пробел
                grp = 0
            Case Else '33 To 47, 58 To 64, 91 To 96, 123 To 126, 127 To 191 ' все остальное
                If grp = 1 Or grp = 2 Then s = Left$(s, i) & " " & Mid$(s, i + 1)
                grp = 3
        End Select
    Next
    InsertSpaceBetweenGroupSimbols3 = s
End Function

Похоже в таком варианте будет работать быстрее, но думаю, и это не идеально.
Тест на моей машинке:

Public Function Test2()
    Dim i As Long
    Dim start As Long
    Dim finish As Long
    Dim str As String
    
    Const strText As String = "qwe 123ER FG$NNИТТИиреп.88*wert@^ 835rty FGHY^&*567@ апрГШвыЩО789=-=89 6578GHTY uiu561#@$  $4ft r678"
    Const lngCount As Long = 30000
    For i = 1 To lngCount
        'разгон процессора
        str = str
    Next i
    
    start = apiTimeGetTime
    For i = 1 To lngCount
        str = InsertSpaceBetweenGroupSimbols(strText)
    Next i
    finish = apiTimeGetTime - start
    Debug.Print "Вариант Анатолия"
    Debug.Print "Длина строки =", Len(strText)
    Debug.Print "Кол-во итераций =", lngCount
    Debug.Print "Время вычисления, ms=", finish
    Debug.Print "Result ="; str
    
    start = apiTimeGetTime
    For i = 1 To lngCount
        str = InsertSpaceBetweenGroupSimbols3(strText)
    Next i
    finish = apiTimeGetTime - start
    Debug.Print
    Debug.Print "Вариант Анатолия +Lukas"
    Debug.Print "Длина строки =", Len(strText)
    Debug.Print "Кол-во итераций =", lngCount
    Debug.Print "Время вычисления, ms=", finish
    Debug.Print "Result ="; str
End Function


Вариант Анатолия
Длина строки = 100
Кол-во итераций = 30000
Время вычисления, ms= 15422
Result =qwe 123 ER FG $ NNИТТИиреп . 88 * wert @^ 835 rty FGHY ^&* 567 @ апрГШвыЩО 789 =-= 89 6578 GHTY uiu 561 #@$ $ 4 ft r 678

Вариант Анатолия +Lukas
Длина строки = 100
Кол-во итераций = 30000
Время вычисления, ms= 2859
Result =qwe 123 ER FG $ NNИТТИиреп . 88 * wert @^ 835 rty FGHY ^&* 567 @ апрГШвыЩО 789 =-= 89 6578 GHTY uiu 561 #@$ $ 4 ft r 678


Ваше имя:

Пароль:

Цитировать: [quote][/quote] Код: [code][/code]
Жирный: [b][/b] Наклонный: [i][/i]
URL: [url][/url] 

Сообщение:

 Размер файла не более 50 Кбт. Большие файлы можно размещать на www.slil.ru

Прикрепить:

 

Для вставки смайлов в текст щелкните по значку.