VB字符串运算

来源:互联网 发布:阿里云勒索病毒查杀 编辑:程序博客网 时间:2024/06/02 18:47
'菜鸟的我写的不怎么好,高手莫笑吐舌头
Option ExplicitPublic Function MyMainCount(ByVal Str As String) As Long '调用这个函数 Str为运算式:可带括号 返回求出来的值'支持+,-,*,/,()'先从()算起 从左至右Dim Str1 As StringDim Count As Long '整个算式的结果Dim i As LongDim bracket As Long '括号位置bracket = 1 '从第一个Count = 0For 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 iMyMainCount = CountEnd FunctionPublic Function MyCount(ByVal Str As String) As Long 'Str不可带括号 四舍五入制On Error Resume NextDim i As Long'判断有几个符号(数字=符号数量+1)Dim sym As Long '符号数量sym = 0For 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 IfNext 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 = 0symcount = 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 IfNext i'将最后一个(结尾为数字)数组提出number(numbercount) = Val(tmpbuffer) '将缓冲区输入到数组numbercount = numbercount + 1 '数字总数+1tmpbuffer = "" '清空运算符 供下次使用'--------------------------------------------'开始运算'没有括号(不同级:先*/再+-)(同级:从左到右)'运算符有几个就算几次'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


原创粉丝点击