在 NCalc 中,为什么 'if (12 > 8)' 解析为 false?
in NCalc why does 'if (12 > 8)' resolve to false?
全新的 NCalc。
我有一个要评估的公式,我得到了一些(对我来说)意想不到的结果。
使用的@T_No_Starters参数=12.
如果公式为if (@T_No_Starters >= 8 ,'T','F')
结果为FALSE
如果公式为if (@T_No_Starters >= 8.0 ,'T','F')
结果为真
如果公式为if (@T_No_Starters >= 10 ,'T','F')
结果为真
我不确定这是怎么回事,为什么 8 是假的,而 8.0 是真的,而 10 又是一个整数是真的?如何确保评估始终正确?我要把每个数字都变成小数吗?我可以设置类似参数类型的东西吗?我什么时候输入我的参数?
下面是我用来达到上述目的的测试代码。
Private Sub Button40_Click(sender As Object, e As EventArgs) Handles Button40.Click
Dim FormulaLine As String = "if (@T_No_Starters >= 8 ,'T','F')"
Dim Parms As New Dictionary(Of String, String)
Parms.Add("T_No_Starters", 12)
Dim OurAnswer = FormulaCalculator.MSGBOXEval(FormulaLine, Parms)
End Sub
Function MSGBOXEval(Formula As String, Parms As Dictionary(Of String, String))
Try
Dim X As New Expression(Formula)
For Each key As String In Parms.Keys
X.Parameters.Add(key, Parms.Item(key))
Next
Dim result = X.Evaluate
MessageBox.Show(result)
Return result
Catch ex As Exception
MessageBox.Show(ex.Message)
Return "Error " & ex.Message
End Try
Return 0
End Function
我最好不要将公式中的值更改为十进制。大于或等于 8 个启动器而不是 8.0。它只是看起来不对劲。参数字典是字符串和字符串,我必须使用它,因为有些是字符串。是不是在需要取值的时候确保参数是取值那么简单?
这是一个很晚的答案,但我 post 为未来的读者准备的。
你的字典由字符串组成:
Dim Parms As New Dictionary(Of String, String)
原始参数类型无关紧要,VB将为您转换为字符串:
Parms.Add("T_No_Starters", 12)
相当于:
Parms.Add("T_No_Starters", "12")
现在很明显,您要将参数添加为字符串:
Dim X As New Expression(Formula)
For Each key As String In Parms.Keys
X.Parameters.Add(key, Parms.Item(key))
Next
NCalc 将尝试无错误地转换类型和计算表达式:
if (@T_No_Starters >= 8 ,'T','F')
相当于:
if (@T_No_Starters >= '8' ,'T','F')
因为它是一个字符串比较(没有自然排序)所以'12' >= '8'
是正确的FALSE
(并且其他例子也变得合理了)。
你应该做什么?只需更改字典的类型即可避免任何隐式转换,让 NCalc 为您完成此操作:
Dim Parms As New Dictionary(Of String, Object)
并且:
Function MSGBOXEval(Formula As String, Parms As Dictionary(Of String, Object))
请注意,使用 Object 您仍然可以将任何类型添加到您的字典中:
Params.Add("T_Text", "some text")
Params.Add("T_Beginning", DateTime.Now)
全新的 NCalc。
我有一个要评估的公式,我得到了一些(对我来说)意想不到的结果。
使用的@T_No_Starters参数=12.
如果公式为if (@T_No_Starters >= 8 ,'T','F')
结果为FALSE
如果公式为if (@T_No_Starters >= 8.0 ,'T','F')
结果为真
如果公式为if (@T_No_Starters >= 10 ,'T','F')
结果为真
我不确定这是怎么回事,为什么 8 是假的,而 8.0 是真的,而 10 又是一个整数是真的?如何确保评估始终正确?我要把每个数字都变成小数吗?我可以设置类似参数类型的东西吗?我什么时候输入我的参数?
下面是我用来达到上述目的的测试代码。
Private Sub Button40_Click(sender As Object, e As EventArgs) Handles Button40.Click
Dim FormulaLine As String = "if (@T_No_Starters >= 8 ,'T','F')"
Dim Parms As New Dictionary(Of String, String)
Parms.Add("T_No_Starters", 12)
Dim OurAnswer = FormulaCalculator.MSGBOXEval(FormulaLine, Parms)
End Sub
Function MSGBOXEval(Formula As String, Parms As Dictionary(Of String, String))
Try
Dim X As New Expression(Formula)
For Each key As String In Parms.Keys
X.Parameters.Add(key, Parms.Item(key))
Next
Dim result = X.Evaluate
MessageBox.Show(result)
Return result
Catch ex As Exception
MessageBox.Show(ex.Message)
Return "Error " & ex.Message
End Try
Return 0
End Function
我最好不要将公式中的值更改为十进制。大于或等于 8 个启动器而不是 8.0。它只是看起来不对劲。参数字典是字符串和字符串,我必须使用它,因为有些是字符串。是不是在需要取值的时候确保参数是取值那么简单?
这是一个很晚的答案,但我 post 为未来的读者准备的。
你的字典由字符串组成:
Dim Parms As New Dictionary(Of String, String)
原始参数类型无关紧要,VB将为您转换为字符串:
Parms.Add("T_No_Starters", 12)
相当于:
Parms.Add("T_No_Starters", "12")
现在很明显,您要将参数添加为字符串:
Dim X As New Expression(Formula)
For Each key As String In Parms.Keys
X.Parameters.Add(key, Parms.Item(key))
Next
NCalc 将尝试无错误地转换类型和计算表达式:
if (@T_No_Starters >= 8 ,'T','F')
相当于:
if (@T_No_Starters >= '8' ,'T','F')
因为它是一个字符串比较(没有自然排序)所以'12' >= '8'
是正确的FALSE
(并且其他例子也变得合理了)。
你应该做什么?只需更改字典的类型即可避免任何隐式转换,让 NCalc 为您完成此操作:
Dim Parms As New Dictionary(Of String, Object)
并且:
Function MSGBOXEval(Formula As String, Parms As Dictionary(Of String, Object))
请注意,使用 Object 您仍然可以将任何类型添加到您的字典中:
Params.Add("T_Text", "some text")
Params.Add("T_Beginning", DateTime.Now)