您现在的位置是: 软件 > 小技巧总汇 > 开发类 > 正文


-FreeHand MX全新体验
-注册表知识群集
-Delphi经典编程100例
-PHP编程实录

让文本框具有四则运算功能
2003-05-08· ·谢明山··Yesky

  VB中文本框一般用于字符串的输入或输出。如果我们在文本框中输入(21+32)*43-((5+6-8)/2+10)*2,你是否希望它能自动计算出结果?以下程序是实现这一功能的全部代码。打开VB新建一工程,在Form1上添加一Text控件,拉长一点,以便输入四则表达式和输出结果,复制以下代码。运行程序后在文本框中输入任意的四则运算式,回车。看看结果如何。

Dim val_Str() As String

Dim Resu As Double

Dim iP_N() As Integer '用于判断数据的正负

Dim sSt() As String * 1

Dim Kuohao() As Integer

Function calc_Kuohao(str_tex As String) As Double '括号计算

Dim text_strr As String

Dim mm_stR As String

text_strr = Trim(str_tex)

i_len = Len(text_strr)

aa = Mid(text_strr, 1, 1)

If aa = "-" Or aa = "+" Or aa = "*" Or aa = "/" Then Str_Text1 = "0" & text_strr

ii = 0

For i = 1 To i_len '判断括号是否成对

 mm_stR = Mid(text_strr, i, 1)

 If mm_stR = "(" Then ii = ii + 1

 If mm_stR = ")" Then ii = ii - 1

 If ii < 0 Then

  MsgBox ("括号不成对")

  Exit Function

 End If

Next

If ii <> 0 Then '

 MsgBox ("括号不成对")

 Exit Function

End If

If InStr(1, text_strr, "(") > 0 Then '如果有括号,现按最里层括号计算

 ReDim sSt(1 To Len(text_strr))

 ReDim Kuohao(1 To Len(text_strr))

 Do While True

  i_len = Len(Trim(text_strr))

  ceng = 1

  For i = 1 To i_len

   sSt(i) = Mid(text_strr, i, 1)

  Next

  If InStr(1, text_strr, "(") <> 0 And InStr(1, text_strr, "(") <> 0 Then '计算有多少对括号,不成对返回0

   text_strr = ""

   For i = 1 To i_len '判断括号是否为0

    text_strr = text_strr & sSt(i)

   Next

   For i = 1 To i_len

    Kuohao(i) = 0 '清零

    If sSt(i) = "(" Then

     Kuohao(i) = ceng

     ceng = ceng + 1

    End If

    If sSt(i) = ")" Then

     ceng = ceng - 1

     Kuohao(i) = ceng

    End If

   Next

   zuiD = 0: id = 1

   For i = 1 To i_len '求最内层括号

    If Kuohao(i) > zuiD Then

     zuiD = Kuohao(i)

     id = i

    End If

   Next  'kuohao(iD)最内层

   mm = InStr(id, text_strr, ")")

   If mm <> 0 Then 'mm=")"

    mm_stR = Mid(text_strr, id + 1, mm - id - 1)

    resu_str = cacul_Str(mm_stR) '计算

    text_strr = Mid(text_strr, 1, id - 1) & resu_str & Mid(text_strr, mm + 1, i_len - mm)

   Else

    Exit Do

   End If

  Else

   text_strr = ""

   For i = 1 To i_len '判断括号是否为0

    text_strr = text_strr & sSt(i)

   Next

   calc_Kuohao = cacul_Str(text_strr)

   Exit Do

  End If

 Loop

Else

 calc_Kuohao = cacul_Str(text_strr) '计算

End If

End Function

 Function cacul_Str(ok_str As String) As Double '字符串表达式的计算,无括号

Dim s_int As Integer

ReDim val_Str(Len(ok_str) + 2)

ReDim iP_N(Len(ok_str) + 1)

aa = Mid(ok_str, i + 1, 1)

If aa = "-" Or aa = "+" Or aa = "*" Or aa = "/" Then ok_str = "0" & ok_str

s_int = 0

val_Str(0) = ""

For i = 0 To Len(ok_str)

 iP_N(i) = 1

Next

i = 0

Do While i < Len(ok_str) '含分解字符串

 aa = Mid(ok_str, i + 1, 1)

 bb = Asc(aa)

 If bb >= 48 And bb <= 57 Or bb = 46 Then '0-9 and .

  val_Str(s_int) = val_Str(s_int) & aa

 Else

  If aa = "+" Or aa = "-" Or aa = "*" Or aa = "/" Then

   If Mid(ok_str, i + 2, 1) = "-" Then

    iP_N(s_int + 2) = -1

    ok_str = Mid(ok_str, 1, i + 1) & Mid(ok_str, i + 3, Len(ok_str))

    ok_str = Trim(ok_str)

    i = i - 1

   Else

    s_int = s_int + 1

    val_Str(s_int) = aa

    s_int = s_int + 1

    val_Str(s_int) = ""

   End If

  Else

   iP_N(s_int) = 1

  End If

 End If

 i = i + 1

Loop

For i = 0 To s_int Step 2

 val_Str(i) = Val(val_Str(i)) * iP_N(i)

Next

If s_int > 1 Then

 For i = 0 To s_int Step 2

  If val_Str(i + 1) = "*" Or val_Str(i + 1) = "/" Then

   If val_Str(i + 1) = "*" Then

    val_Str(i) = Val(val_Str(i)) * Val(val_Str(i + 2))

   Else

    val_Str(i) = Val(val_Str(i)) / Val(val_Str(i + 2))

   End If

   For j = i + 1 To s_int

    val_Str(j) = val_Str(j + 2)

   Next

   val_Str(s_int - 1) = "": val_Str(s_int) = ""

   s_int = s_int - 2

   i = i - 2

  End If

 Next

 Resu = val_Str(0)

 For i = 1 To s_int Step 2

  If val_Str(i) = "-" Then val_Str(i + 1) = Val(val_Str(i + 1)) * (-1)

  Resu = Resu + val_Str(i + 1)

 Next

 cacul_Str = Resu

Else

 cacul_Str = val_Str(0)

End If

End Function

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)

 If KeyCode = 13 Then '回车开始计算

  Result = calc_Kuohao(Text1.Text)

  Text1.Text = Text1.Text & "=" & Result

 End If

End Sub

【责任编辑:原野】
【发表评论】【关闭窗口】
■ 相关内容
 用动作脚本动态创建和控制文本框
 巧用样式表,让文本框与按钮变个样
 用VB6分离出文本框的单词
 文本框控件的消息及应用
 DHTML制作有日期选择的文本框(一)
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!