вадене от стринг...
4 отговора
195 прегледа
вадене от стринг...
Здравейте, въпроса ми е следния:
Имаме един стринг "23 155 250 47 52..." как мога да извадя от него числата (число1:23 , число2:155 , число3:250...) Помагайте
*Между другото числата идват от серийния порт
Имаме един стринг "23 155 250 47 52..." как мога да извадя от него числата (число1:23 , число2:155 , число3:250...) Помагайте
*Между другото числата идват от серийния порт
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. Всичко зависи от данните, които ползваш.
Щирлиц
Хайде ще се включа за малко, че съм на работа, а после, ако все още не ти е ясно - ще питаш пак.
Та значи, когато имаме такъв "залепен" стринг, можем да разделим неговите части с функцията 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. Всичко зависи от данните, които ползваш.
Щирлиц
Re: вадене от стринг...
Благодаря ти Щирлиц, сега ми светна за какво иде реч.. но сега да обясня малко по-подробно за какво става дума...
На порта имам едно устройство което праща/приема числа от 1 до 255. Аз го бях направил така: В един таймер бях сложил да се сканира порта и ако има не6то се прибавя към стринг. Така беше.. :) Сега обмислям друг вариант... инпутлен=1 Така мисля да чета направо от порта, но програмата гърми :( Проблема е че съм направил един цикъл ( знам колко байта ще дойдат) който чете от порта но прекалено бързо !!! Проблема е че устройството не праща толкова бързо и цикъла дава грешека /низ=Асц(порт.инпут)/ тоест опитвам се да взема нещо от порта но то все оше не е там :( Опитах с разни паузи, но нищо :((
Говорих с един приятел за проблема и той ми обясни че в делфито може да се дефинира масив от който мога да вадя данните без да търся разни интервали.
Има ли аджаба такова животно и в бейсика ? Тук попрерових разни дебели тефтери ама нищо не можах да намеря..
На порта имам едно устройство което праща/приема числа от 1 до 255. Аз го бях направил така: В един таймер бях сложил да се сканира порта и ако има не6то се прибавя към стринг. Така беше.. :) Сега обмислям друг вариант... инпутлен=1 Така мисля да чета направо от порта, но програмата гърми :( Проблема е че съм направил един цикъл ( знам колко байта ще дойдат) който чете от порта но прекалено бързо !!! Проблема е че устройството не праща толкова бързо и цикъла дава грешека /низ=Асц(порт.инпут)/ тоест опитвам се да взема нещо от порта но то все оше не е там :( Опитах с разни паузи, но нищо :((
Говорих с един приятел за проблема и той ми обясни че в делфито може да се дефинира масив от който мога да вадя данните без да търся разни интервали.
Има ли аджаба такова животно и в бейсика ? Тук попрерових разни дебели тефтери ама нищо не можах да намеря..
Алтернативно решение.
Струва ми се че с регулярен израз ще е по-удобно.
Това съм го тествал под 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щ на