Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Форматный контроль строки Добавлено: 30.03.07 09:00  

Автор вопроса:  AndreyMp | ICQ: 237822510 
Задали мне с утра задачку. Нужно провести форматный контроль адресов на соответствие КЛАДРу. Проще говоря, на входе имеем строку (любую), надо посчитать сколько в ней запятых, и если их 9 (девять), то выдать True (проверку прошел), а если нет – то False.
Пока что придумалось 4 варианта, но
- никак не соображу какую маску подсунуть like.
- по скорости все варианты почти одинаковые. Победил вариант 3 (даже с лишним Asc), что для меня явилось полной неожиданностью.
Может предложите получше, а то с утра что то башка не варит.

Function AdrKLADR1(inS As String) As Boolean
  Dim flgY As Boolean
  flgY = inS Like "вот тут не соображу, какую маску написать"
  AdrKLADR = flgY
End Function

Function AdrKLADR2(inS As String) As Boolean
  Dim arrY() As String
  arrY = Split(inS, ",")
  If UBound(arrY) = 9 Then
     AdrKLADR2 = True
  Else
     AdrKLADR2 = False
  End If
End Function

Function AdrKLADR3(inS As String) As Boolean
  Dim i As Long
  Dim k As Long
  k = 0
  For i = 1 To Len(inS)
    If Asc(Mid(inS, i, 1)) = 44 Then
      k = k + 1
    End If
  Next i
  If k = 9 Then
     AdrKLADR3 = True
  Else
     AdrKLADR3 = False
  End If
End Function

Function AdrKLADR4(inS As String) As Boolean
  Dim poz1 As Long
  Dim k As Long
  poz1 = 0
  k = 0
  Do While Len(inS) > poz1
    poz1 = InStr(poz1 + 1, inS, ",", 1)
    If poz1 > 0 Then
      k = k + 1
    Else
      Exit Do
    End If
  Loop
  If k = 9 Then
     AdrKLADR4 = True
  Else
     AdrKLADR4 = False
  End If
End Function

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #1 Добавлено: 30.03.07 09:52
попробуй так:

flgY = inS Like "*,*,*,*,*,*,*,*,*,*"

Ответить

Номер ответа: 2
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #2 Добавлено: 30.03.07 10:10
:)) Слона то я и не заметил, подумал *-это все символы,включая и запятую. А так вроде работает - спасибо, но на 10000 иттераций получается:
Вариант 1 - 14.04688
Вариант 1 - 16.0625
Вариант 1 - 13.5625
Вариант 1 - 14.07813
   Конечно, все это величины одного порядка, и заметной скорости не ощутимо, но почему то тупой проход по строке с сравнением оказывается быстрее.

Ответить

Номер ответа: 3
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #3 Добавлено: 30.03.07 10:11
Брр...
Вариант 1 - 14.04688
Вариант 1 - 16.0625
Вариант 1 - 13.5625
Вариант 1 - 14.07813

Конечно:
Вариант 1 - 14.04688
Вариант 2 - 16.0625
Вариант 3 - 13.5625
Вариант 4 - 14.07813

Ответить

Номер ответа: 4
Автор ответа:
 Sur



ICQ: 1249088 

Вопросов: 10
Ответов: 304
 Web-сайт: sur.hotbox.ru/
 Профиль | | #4
Добавлено: 30.03.07 13:12
Хочешь скорости - сюда ходи:
http://www.xbeat.net/vbspeed/index.htm

(inStrCount)

Ответить

Номер ответа: 5
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #5 Добавлено: 30.03.07 14:32
Sur Спасибо. Посмотрел, хорошая ссылка. Будем тестить.

Ответить

Номер ответа: 6
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #6 Добавлено: 30.03.07 14:49
Хм... Потестил (строка ",,,,,";)
с InStrCount04 - 18,89
c InStrCount05 - 15,2
Уж лучше просто Вариант 1 - 14,156
:((

Ответить

Номер ответа: 7
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #7 Добавлено: 30.03.07 15:45
Всем спасибо. Ни один из варинтов не превосходит другие по скорости хотя бы на порядок. Выигрышь в наносекунды, на моих объемах обработки такой инфы (>300000 подобных строк) ничего не дает (вернее дает +- 1-2 сек), но в общем проекте они теряются.

Ответить

Номер ответа: 8
Автор ответа:
 W[4Fh]LF



Вопросов: 0
Ответов: 187
 Web-сайт: hunger.ru
 Профиль | | #8
Добавлено: 31.03.07 16:17
Function AdrKLADR5(inS As String) As Boolean
    Dim sByte() As Byte
    Dim i As Long, k As Long
    
    k = 0
    ReDim sByte(Len(inS))
    sByte = StrConv(inS, vbFromUnicode)
    For i = 0 To UBound(sByte)
        If sByte(i) = 44 Then k = k + 1
    Next i
    If k = 9 Then AdrKLADR5 = True Else AdrKLADR5 = False
End Function


Быстрее всех за исключением AdrKLADR1

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 31.03.07 20:05
а в чём прикол всех тестов если проект не критичен к скорости? Если иначе то Си, или асм отлично справится с задачей...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам