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, Str, ")", 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, i + 1, 1) = "-" Or Mid(Str, i + 1, 1) = "*" Or Mid(Str, i + 1, 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, i + 1, 1)) >= &H30 And Asc(Mid(Str, i + 1, 1)) <= &H39 Then '是0~9的Ascii码
        tmpbuffer = tmpbuffer & Mid(Str, i + 1, 1) '添加到缓冲区
    Else '是运算符
        number(numbercount) = Val(tmpbuffer) '将缓冲区输入到数组
        numbercount = numbercount + 1 '数字总数+1
        tmpbuffer = "" '清空运算符 供下次使用
        '将运算符输入到数组
        symstring(symcount) = Mid(Str, i + 1, 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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值