大家讨论:如何在包含若干个数字的字符串中获取第任意个数

z_liming 2006-10-12 11:52:28
例如:“12 34 45 56 67 78 122 -123”,间隔符也可是其它字符,如:“,”
如何提取第三个数,即:45
当然用instr,可以实现,但如何做才是高效的呢?
...全文
252 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rotartsinimdA 2006-10-12
  • 打赏
  • 举报
回复
不是吧,我就去厨房转了一圈,回来点了一下回复,就这样了。。
还以为是沙发那。。 -.-!
so fast !
rotartsinimdA 2006-10-12
  • 打赏
  • 举报
回复
使用数组。
例如:
dim vN() as string '定义一个数组
dim vS as string ' 定义一个字符串
vs= "12,34,45,56,67,78,122,123"
vn = split(vs,",")
msgbox vn(2)
看看结果就知道了。

原理:
把按照字符串的分隔符","把字符串vS分割,然后存放入数组vN
vN 的第三个元素就是你要的45
分割使用split函数分割
更详细的方法,建议你安装一个MSDN看看。。。
上面是例子。这样的方法在VB中来看是比较高效的(可能也是唯一的快捷途径)
DengXingJie 2006-10-12
  • 打赏
  • 举报
回复
熱鬧一下
迈克揉索芙特 2006-10-12
  • 打赏
  • 举报
回复
老大的速度比我的快多了
佩服!!!
TechnoFantasy 2006-10-12
  • 打赏
  • 举报
回复
上面我的代码测试了一下,对一个包含40个数字的字符串做500次访问,时间在200毫秒左右。
迈克揉索芙特 2006-10-12
  • 打赏
  • 举报
回复
GetNumder<----------GetNumber
粗心啊

老大的方法也不错
迈克揉索芙特 2006-10-12
  • 打赏
  • 举报
回复
更正:
Dim str As String
str = "12 34 45 56 67 78 122 -123"
Debug.Print GetNumder(str, 3)

Function GetNumder(ByVal Text As String, ByVal Index As Long) As Long
Dim str1 As String, str2 As String
Dim ascX As Integer, i As Long
Dim str() As String

str1 = Text
For i = 1 To Len(str1)
str2 = Mid(str1, i, 1)
ascX = Asc(str2)
If ascX > 59 Or ascX < 48 Then
str1 = Replace(str1, str2, Space(1))
End If
Next

Do While InStr(1, str1, Space(2))
str1 = Replace(str1, Space(2), Space(1))
Loop

str = Split(str1, Space(1))

GetNumder = str(Index - 1)
End Function
TechnoFantasy 2006-10-12
  • 打赏
  • 举报
回复
Dim s As String
'在字符串最后要加一个非数字字符
s = "12 34 45 56 67 78 122 -123 "

Dim c() As Byte

c = StrConv(s, vbFromUnicode)

Dim ss(100) As String
Dim count As Integer
count = 0

Dim prv As Boolean
Dim prv1 As Boolean

prv = False
prv1 = False

For i = LBound(c) To UBound(c)
If ((c(i) >= 48) And (c(i) <= 59)) Then
prv1 = True
Else
prv1 = False
End If

If (prv1) Then
ss(count) = ss(count) + Chr(c(i))
End If

If ((prv = True) And (prv1 = False)) Then
count = count + 1
End If

prv = prv1
Next i

For i = LBound(ss) To count
Debug.Print ss(i)
Next i
迈克揉索芙特 2006-10-12
  • 打赏
  • 举报
回复

Dim str As String
str = "12 34 45 56 67 78 122 -123"
Debug.Print GetNumder(str, 3)

Function GetNumder(ByVal Text As String, ByVal Index As Long) As Long
Dim str1 As String, str2 As String
Dim ascX As Integer, i As Long
Dim str() As String

str1 = Text
For i = 1 To Len(str1)
str2 = Mid(str1, i, 1)
ascX = Asc(str2)
If ascX > 97 Or ascX < 48 Then
str1 = Replace(str1, str2, Space(1))
End If
Next

Do While InStr(1, str1, Space(2))
str1 = Replace(str1, Space(2), Space(1))
Loop

str = Split(str1, Space(1))

GetNumder = str(Index - 1)
End Function
GoldFox 2006-10-12
  • 打赏
  • 举报
回复
用Split函数把字符串拆分到数组,再直接取就可以了
ZOU_SEAFARER 2006-10-12
  • 打赏
  • 举报
回复
Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Dim str As String

Function GetNumber(ByVal Text As String, ByVal Index As Long) As Long
Dim i As Integer
Dim j As Integer
Dim str_Temp As String * 1
Dim Str_Text As String
Dim str_Arr() As String
Dim str_Arr1() As String
Str_Text = vbNullString
For i = 1 To Len(Text)
str_Temp = Mid(Text, i, 1)
If Asc(str_Temp) < 48 Or Asc(str_Temp) > 57 Then
Str_Text = Str_Text & ","
Else
Str_Text = Str_Text & str_Temp
End If
Next
str_Arr = Split(Str_Text, ",")
For i = 0 To UBound(str_Arr)
If IsNumeric(str_Arr(i)) = True Then
ReDim Preserve str_Arr1(j) As String
str_Arr1(j) = str_Arr(i)
j = j + 1
End If
Next

If Index <= UBound(str_Arr1) + 1 And Index > 0 Then
GetNumber = str_Arr1(Index - 1)
Else
GetNumber = vbNullString
End If
End Function


Private Sub Command1_Click()
Dim lng_Loop As Long
Dim lng_Start As Long
Dim lng_End As Long
lng_Start = timeGetTime
For lng_Loop = 1 To 500
Call GetNumber(str, 3)
Next
lng_End = timeGetTime
Debug.Print lng_End - lng_Start
End Sub

Private Sub Form_Load()
str = "12 34 45 56 67 78 122 -123"
End Sub

运行500次,时间30MS
ZOU_SEAFARER 2006-10-12
  • 打赏
  • 举报
回复
看我这样的方法可以不? 效率问题如何?
Option Explicit
Dim str As String

Function GetNumber(ByVal Text As String, ByVal Index As Long) As Long
Dim i As Integer
Dim j As Integer
Dim str_Temp As String * 1
Dim Str_Text As String
Dim str_Arr() As String
Dim str_Arr1() As String
Str_Text = vbNullString
For i = 1 To Len(Text)
str_Temp = Mid(Text, i, 1)
If Asc(str_Temp) < 48 Or Asc(str_Temp) > 57 Then
Str_Text = Str_Text & ","
Else
Str_Text = Str_Text & str_Temp
End If
Next
str_Arr = Split(Str_Text, ",")

'下面也可以使用数组移位来达到删除非数字元素
'***********************************************************************
For i = 0 To UBound(str_Arr)
If IsNumeric(str_Arr(i)) = True Then
ReDim Preserve str_Arr1(j) As String
str_Arr1(j) = str_Arr(i)
j = j + 1
End If
Next
**************************************************************************
If Index <= UBound(str_Arr1) + 1 And Index > 0 Then
GetNumber = str_Arr1(Index - 1)
Else
GetNumber = vbNullString
End If
End Function


Private Sub Form_Load()
str = "12 34 45 56 67 78 122 -123"
Debug.Print GetNumber(str, 3)
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧