前端之家收集整理的这篇文章主要介绍了
VB字符串运算,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
- '菜鸟的我写的不怎么好,高手莫笑
- Option Explicit
-
- Public Function MyMainCount(ByVal Str As String) As Long '调用这个函数 Str为运算式:可带括号 返回求出来的值
- '支持+,-,*,/,()
- '先从()算起 从左至右
- Dim Str1 As String
- Dim Count As Long '整个算式的结果
- Dim i As Long
- Dim bracket As Long '括号位置
- bracket = 1 '从第一个
- Count = 0
- For i = 0 To Len(Str) '循环检测是否有括号
- bracket = InStr(bracket,Str,"(",vbTextCompare)
- If bracket = 0 Then '没有括号
- Count = MyCount(Str)
- Else '有括号
- '先算括号里面的
- Str1 = Mid(Str,bracket + 1,InStr(bracket,")",vbTextCompare) - 2) '分解出括号里面的 无括号
- Count = Count + MyCount(Str1)
- Str = Replace(Str,"(" & Str1 & ")",CStr(Count),vbTextCompare) '将原来字符串中的()中的内容替换为运算后的得数
- Count = 0 '只是为了将括号去掉 所以不记返回值
- End If
- bracket = bracket + 1 '当前括号已经运算所以作废 先前移动一个字符
- Next i
- MyMainCount = Count
- End Function
-
- Public Function MyCount(ByVal Str As String) As Long 'Str不可带括号 四舍五入制
- On Error Resume Next
- Dim i As Long
- '判断有几个符号(数字=符号数量+1)
- Dim sym As Long '符号数量
- sym = 0
- For i = 0 To Len(Str)
- If Mid(Str,i + 1,1) = "+" Or Mid(Str,1) = "-" Or Mid(Str,1) = "*" Or Mid(Str,1) = "/" Then
- sym = sym + 1
- End If
- Next i
- '提出所有数字存入数组 提出所有符号存入到数组
- Dim number() As Long '数字数组
- Dim numbercount As Long '数字总数
- Dim tmpbuffer As String '缓冲数组字符区
- ReDim number(sym) '动态设置数组维数
- '-------------------------------------------
- Dim symstring() As String '符号数组
- ReDim symstring(sym - 1) '动态设置数组维数
- Dim symcount As Long '符号总数
- numbercount = 0
- symcount = 0
- '开头不能是符号
- For i = 0 To Len(Str) - 1
- If Asc(Mid(Str,1)) >= &H30 And Asc(Mid(Str,1)) <= &H39 Then '是0~9的Ascii码
- tmpbuffer = tmpbuffer & Mid(Str,1) '添加到缓冲区
- Else '是运算符
- number(numbercount) = Val(tmpbuffer) '将缓冲区输入到数组
- numbercount = numbercount + 1 '数字总数+1
- tmpbuffer = "" '清空运算符 供下次使用
- '将运算符输入到数组
- symstring(symcount) = Mid(Str,1)
- symcount = symcount + 1
- End If
- Next i
- '将最后一个(结尾为数字)数组提出
- number(numbercount) = Val(tmpbuffer) '将缓冲区输入到数组
- numbercount = numbercount + 1 '数字总数+1
- tmpbuffer = "" '清空运算符 供下次使用
- '--------------------------------------------
- '开始运算
- '没有括号(不同级:先*/再+-)(同级:从左到右)
- '运算符有几个就算几次
- 'Dim Level As Long '1=乘除级别 0=加减级别
- Dim ii As Long
- 'Level = 0
- 'For i = 0 To symcount - 1 '判断是否有乘除符号
- ' '找乘除
- ' If symstring(i) = "/" Or symstring(i) = "*" Then '有乘除
- ' Level = 1 '乘除级别
- ' Exit For
- ' End If
- 'Next i
- '先乘除后加减-------------------------------------------------------------
- '乘除从左到右
- For i = 0 To symcount - 1
- If i > symcount - 1 Then '超出范围了
- Exit For
- End If
- If symstring(i) = "/" Or symstring(i) = "*" Then '乘法Or除法
- If symstring(i) = "/" Then
- '没有算的最左边的/符号 开始进行除法运算
- number(i) = number(i) / number(i + 1) '除法运算
- End If
- If symstring(i) = "*" Then
- '没有算的最左边的*符号 开始进行乘法运算
- number(i) = number(i) * number(i + 1) '除法运算
- End If
- '数字数组减少一个 缺了一个空补上
- For ii = i + 1 To numbercount - 1
- number(ii) = number(ii + 1) '替换
- Next ii
- numbercount = numbercount - 1
- ReDim Preserve number(numbercount - 1) '保留+重定义
- '符号数组减少一个
- For ii = i + 1 To symcount - 1
- symstring(ii - 1) = symstring(ii)
- Next ii
- symcount = symcount - 1
- ReDim Preserve symstring(symcount - 1)
- i = i - 1 '回滚
- End If
- Next i
- '加减从左到右
- For i = 0 To symcount - 1
- If i > symcount - 1 And symcount < 1 Then '超出范围了并且没有运算符号了就退出循环(不用运算了)
- Exit For
- Else '其中有一个为False特别是第二个就说明还有一个运算符 还要运算一次 所以将第一个与第二个进行运算
- If i > symcount - 1 Then
- i = 0 '设置数组元素第1个
- End If
- End If
- If symstring(i) = "+" Or symstring(i) = "-" Then '加法Or减法
- If symstring(i) = "+" Then
- '没有算的最左边的/符号 开始进行除法运算
- number(i) = number(i) + number(i + 1) '加法运算
- End If
- If symstring(i) = "-" Then
- '没有算的最左边的*符号 开始进行乘法运算
- number(i) = number(i) - number(i + 1) '减法运算
- End If
- '数字数组减少一个 缺了一个空补上
- For ii = i + 1 To numbercount - 1
- number(ii) = number(ii + 1) '替换
- Next ii
- numbercount = numbercount - 1
- ReDim Preserve number(numbercount - 1) '保留+重定义
- '符号数组减少一个
- For ii = i + 1 To symcount - 1
- symstring(ii - 1) = symstring(ii)
- Next ii
- symcount = symcount - 1
- ReDim Preserve symstring(symcount - 1)
- i = i - 1
- End If
- Next i
- '-----------------------------------------------------------------------------------------------
- MyCount = number(0) '返回结果(数组的第一个元素) 因为前面删除了空出来的元素 最后只剩下答案了
- End Function