вадене от стринг...

4 отговора 195 прегледа
#1

вадене от стринг...

Здравейте, въпроса ми е следния:
Имаме един стринг "23 155 250 47 52..." как мога да извадя от него числата (число1:23 , число2:155 , число3:250...) Помагайте

*Между другото числата идват от серийния порт

Отговор
в отговор на novobranec #2

Re: вадене от стринг...

Split()

Отговор
в отговор на novobranec #3

Re: вадене от стринг...

ActiveX ти е обяснил прекрасно, но май не точно като за новобранец... ;о)

Хайде ще се включа за малко, че съм на работа, а после, ако все още не ти е ясно - ще питаш пак.

Та значи, когато имаме такъв "залепен" стринг, можем да разделим неговите части с функцията Split(), за която обаче трябва да знаем, че разделя дадения стринг по дадения разделител, и разделителя "изчезва". В твоя случай разделителя е "интервал". Но трябва да си сигурен, че между числата наистина има интервал, и този интервал не е само мястото на минуса, в който случай обаче при отрицателно число - няма да има интервал... Ок, това е частен случай, ще го обсъдим после...

Първо си дефинираш динамичен масив от стрингове:
Dim strLines() As String

После хващаш стринга, който си получил от серийния порт, и го разполагаш в масива, с разделител "шпация":
strLines = Split(strString, " ")

И вече имаш n на брой елементи на масива, като във всеки елемент - ти е записана по една част от стринга.

Можеш да ползваш първата част от стринга като число така:
intNum = Val(strLines(0))

Или да ползваш последната част от масива така:
intNum = Val(strLines(UBound(strLines)))

Т.е. в последния пример използвам функцията UBound(), която връща "номера" на последния елемент от масив. Трябва да имаш в предвид, че масив от 10 елемента например - ще бъдат номерирани от 0 до 9. Значи можеш да направиш и цикъл за обхождане на масива:
For intCount = 0 To UBound(strLines)
intNum = intNum + Val(strLines(intCount))
Next

Това последното беше като пример за сумиране на всичките елементи на масива. ;о)

Имай в предвид, че преобразуването на стринга в число с функцията Val() е в зависимост от типа на променливата, в която записваш стойността. Значи - по-добре е да си деклрарираш всички променливи преди това в конкретен тип, и да използваш други функции за преобразуване на стринга в число, което да съответства на искания от теб тип:
intNum = CLng(strString)
dblNum = CDbl(strDtring)

В последните два реда давам пример, с който да ти обърна внимание на разликата при преобразуване на стринг в Long, и на стринг в Double. Всичко зависи от данните, които ползваш.


Щирлиц
Отговор
в отговор на Щиpлиц #4

Re: вадене от стринг...

Благодаря ти Щирлиц, сега ми светна за какво иде реч.. но сега да обясня малко по-подробно за какво става дума...
На порта имам едно устройство което праща/приема числа от 1 до 255. Аз го бях направил така: В един таймер бях сложил да се сканира порта и ако има не6то се прибавя към стринг. Така беше.. :) Сега обмислям друг вариант... инпутлен=1 Така мисля да чета направо от порта, но програмата гърми :( Проблема е че съм направил един цикъл ( знам колко байта ще дойдат) който чете от порта но прекалено бързо !!! Проблема е че устройството не праща толкова бързо и цикъла дава грешека /низ=Асц(порт.инпут)/ тоест опитвам се да взема нещо от порта но то все оше не е там :( Опитах с разни паузи, но нищо :((
Говорих с един приятел за проблема и той ми обясни че в делфито може да се дефинира масив от който мога да вадя данните без да търся разни интервали.
Има ли аджаба такова животно и в бейсика ? Тук попрерових разни дебели тефтери ама нищо не можах да намеря..

Отговор
в отговор на novobranec #5

Алтернативно решение.

Струва ми се че с регулярен израз ще е по-удобно. Това съм го тествал под VBA със Аксес 2003. Функцията връща колекция с числата от подадения и стринг.

Function GetNumbers(astring)
Dim regEx, Matches
Set regEx = New VBScript_RegExp_10.RegExp
regEx.Global = True
regEx.Pattern = "[^\s]*?(\s+)|[^\s]+"
Set Matches = regEx.Execute(astring)
Set GetNumbers = Matches
End Function


От неизбежното се възмущава само този, който е неразумен.

Редактирано от Учeщ на

Отговор