Нахождение числа в строке

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Нахождение числа в строке

Сообщение Sanya Z » 06.01.2004 (Вт) 15:34

Как из такой строки выбрать только число :?: Например: "pr123st"
Большое спасибо!
И пусть в моих поступках не было логики...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.01.2004 (Вт) 18:09

Код: Выделить всё
dim I as long, pos as long

for i=0 to 9
   pos=instr(stroka,cstr(i))
   if pos>0 then
      number=val(mid(stroka,pos))
      Exit for'а может и не надо...
   enb if
next

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.01.2004 (Вт) 18:11

Код: Выделить всё
for n = 1 to len(s)
  d= val (mid$(s,n))
  if d<>0 then exit for
next n
debug.print d

найдет ПЕРВОЕ число в строке.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 06.01.2004 (Вт) 18:35

А через Like [0-9] нельзя?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.01.2004 (Вт) 18:48

Можно, только еще "." для дробей и "-" для отрицательных.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 06.01.2004 (Вт) 18:57

Простите за глупость :oops:
Что такое like??

Это такой оператор, или функция???
Ичто он/она делает.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 06.01.2004 (Вт) 21:39

Оператор сравнения. Читай msdn.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Сообщение Sanya Z » 06.01.2004 (Вт) 23:41

Насколько я понял вышеназванные коды находят только первую цифру числа, а как выдрать все число :?: Помню, я где-то видел пример, когда в TextBox можно было вводить только цифры. Возможно, на основ этого можно найти и все число, путем посимвольного опознавания. Если у кого есть, киньте please! :arrow:
И пусть в моих поступках не было логики...

vilin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 06.01.2004 (Вт) 22:11
Откуда: Кишинёв

Сообщение vilin » 07.01.2004 (Ср) 0:54

Например, st="fsdf342hfdg"

Тогда:

dim chislo as string
dim ch as string

for i=1 to len(st)
ch=mid(st,i,1)
if IsInt(ch) =true then ' я не помню точно: IsInt или IsInteger... посмотришь сам
chislo = chislo & ch
endif
next i

dim a as integer
a = int(chislo) ' а - нужное тебе число

Вроде бы, должно работать, не проверял...
Если что, пиши...

Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Сообщение Sanya Z » 07.01.2004 (Ср) 2:03

На IsInt ругается, а идея правильная.
И пусть в моих поступках не было логики...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.01.2004 (Ср) 9:51

Короче, в общем виде...
Код: Выделить всё
function filter(byval s as string, byval f as string) as string
  dim i as long, tmpStr as string
  for i=1 to len(s)
    tmpstr=mid$(s,i,1)
    if instr(f,tmpstr) then filter=filter+tmpstr
  next
end function

debug.? filter("dfgsdf04567d","0123456789.")
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.01.2004 (Ср) 15:25

Sanya Z
Насколько я понял вышеназванные коды находят только первую цифру числа, а как выдрать все число


Ты бы хоть проверил, что тебе написали, а потом делел выводы. Мой пример дает ВСЕ число, только допиши вначале:
Код: Выделить всё
  DIM n as integer, d as duoble, s as string
  s="jddjk-35.345hkjd lsa "

я это не вписал - думал и так понятно.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.01.2004 (Ср) 15:32

GSerg
Вариант более, чем с одним числом, например такой:
Код: Выделить всё
Debug.Print filter("dfgsdf04567d34656", "0123456789.")

или с несколькими десятичными точками, дает неверный результат.

vilin
Начинающий
Начинающий
 
Сообщения: 23
Зарегистрирован: 06.01.2004 (Вт) 22:11
Откуда: Кишинёв

Сообщение vilin » 07.01.2004 (Ср) 16:54

Я тут немного помучался, и нашёл новый способ решения... правда, переменных многовато...

Код: Выделить всё
Dim st As String
    st = "ksjhgk -32542.25 fkgjdf"
Dim i As Integer
Dim ch As String
Dim ch2 As String
Const stroka = "1234567890"
Dim chislo As String


For i = 1 To Len(st)
    ch = Mid(st, i, 1)
    Select Case ch
        Case "-"
            ch2 = Mid(st, i + 1, 1)
            If InStr(stroka, ch2) Then
                chislo = chislo & Mid(st, i, 2)
                i = i + 1
            End If
   
        Case "."
            If i <> 1 Then
                ch2 = Mid(st, i - 1, 1)
                If InStr(stroka, ch2) Then
                    chislo = chislo & Mid(st, i, 1)
                End If
            End If
    End Select
   
    If InStr(stroka, ch) Then
        chislo = chislo & Mid(st, i, 1)
    End If
   
Next i

chislo - Нужное тебе число (в текстовом виде)
Далее, в зависимости от типа числа (Integer или Double), преобразовываешь его в нужный тебе тип...

Sanya Z
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 18.08.2003 (Пн) 3:15
Откуда: Москва

Сообщение Sanya Z » 07.01.2004 (Ср) 22:35

Всем огромное спасибо! :D Все работает :D
И пусть в моих поступках не было логики...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 69

    TopList