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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...