【问题标题】:convert a string to an operator将字符串转换为运算符
【发布时间】:2013-11-25 22:18:31
【问题描述】:

在我的 VB.Net 4.5 WPF 应用程序中,我有 3 个文本框供用户输入以下内容:

  1. txtFirstNumber
  2. txt运算符
  3. txtSecondNumber

问题:我发现我无法将运算符字符串转换为实际的数学运算符,因为运算符没有数据类型。

我无法使用 + 或 & 或 val 或 eval 来计算:txtFirstNumber txtOperator txtSecondNumber

例如:如果用户输入 12 作为 firstNumber,+ 作为运算符,5 作为 secondNumber,那么我想自动计算 12 + 5 并将答案放在名为 CalculateAnswer 的标签中。

如果用户输入不同的内容,我希望仍然进行计算。即使他们输入双精度数作为其中一个数字。

所以我需要帮助!这是我的代码:

    Dim CalcAnswer As Double
    Try
        Dim first As Double = CDbl(txtFirstNumber.Text)
        Dim op As String = txtOperator.Text
        Dim second As Double = CDbl(txtSecondNumber.Text)
        CalcAnswer = Eval(first & op & second)
        CalculateAnswer.Content = CStr(CalcAnswer)
    Catch CalcError As Exception
        MsgBox(CalcError.Message)
    End Try

提前致谢!

【问题讨论】:

  • 你的Eval()函数是什么样的?
  • 另外:您可能需要使用 Decimal 而不是 Double。
  • 谢谢 Joel - 我没有 Eval 函数。谷歌告诉我,Eval 是 Evaluate 的缩写,它已经被定义了。但它不起作用。
  • Eval() 不是 .Net 的一部分,并且有充分的理由(Eval() 函数是巨大的安全漏洞)。这部分你必须自己写。

标签: wpf vb.net operator-keyword type-conversion


【解决方案1】:

我会这样做:

Try
    Dim first As Decimal = Decimal.Parse(txtFirstNumber.Text)
    Dim second As Decimal = Decimal.Parse(txtSecondNumber.Text)
    CalculateAnswer.Content = Eval(first, second, txtOperator.Text).ToString()
Catch CalcError As Exception
    MsgBox(CalcError.Message)
End Try

'...

Function Add(ByVal a As Decimal, ByVal b As Decimal) As Decimal
   Return a + b
End Function

Function Subtract(ByVal a As Decimal, ByVal b As Decimal) As Decimal
   Return a - b
End Function

Function Multiply(ByVal a As Decimal, ByVal b As Decimal) As Decimal
   Return a * b
End Function

Function Divide(ByVal a As Decimal, ByVal b As Decimal) As Decimal
   Return a / b
End Function

Function Eval(ByVal a As Decimal, ByVal b As Decimal, ByVal Operator As String) As Decimal
   Operator = Operator.Trim()
   Select Operator
      Case "+"
        Return Add(a, b)
      Case "-"
        Return Subtract(a, b)
      Case "*","x"
        Return Multiply(a, b)
      Case "/"
         Return Divide(a, b)
      Case Else 
          Throw New InvalidArgumentException("Did not recognize operator: " & Operator)
   End Select
End Function

【讨论】:

  • 也许检查除法函数的 b 不是 0?
  • 天哪,我认为这很简单!
  • 感谢 Plutonix - 除以零是危险的。
  • @Plutonix 做什么,抛出另一个 InvalidArgument? OP 代码中现有的错误处理已经很好地解决了这个问题。
  • 感谢 Joel,经过调整,您的代码可以正常工作了! [运算符是关键字,所以我不能使用它。 invalidArgumentException 也不起作用,所以我改用了 try catch 块。都好。谢谢!]
猜你喜欢
  • 2019-03-24
  • 2011-07-04
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多