我有一个使用Visual Studio 2013用Visual Basic编写的单位转换器。该程序正常工作,直到用户开始计算零点或小数点。然后我收到此错误消息:
An unhandled exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll
Additional information: Conversion from string "." to type 'Decimal' is not valid.
以下是我的一些程序代码。
Private Function GetLength1(ByVal decLengthUnit1 As Decimal) As Decimal
Dim decResult1 As Decimal
If cboUnitType.SelectedItem = "Length" Then
' converts kilometer to...
If cbo1.SelectedItem = "Kilometer" Then
If cbo2.SelectedItem = "Meter" Then
decResult1 = (decLengthUnit1 * 1000)
ElseIf cbo2.SelectedItem = "Centimeter" Then
decResult1 = (decLengthUnit1 * 100000)
ElseIf cbo2.SelectedItem = "Millimeter" Then
decResult1 = (decLengthUnit1 * 1000000)
End If
End If
Return decResult1.ToString("N").Trim("0")
End Function
Private Sub txtUnit1_TextChanged(sender As Object, e As EventArgs) Handles txtUnit1.TextChanged
If suppressTextBox1TextChanged = False Then
' convert string to numeric data type
Decimal.TryParse(txtUnit1.Text, decUnit1)
' handle String.Empty, or negative sign
If txtUnit1.Text = "" OrElse txtUnit1.Text = "-" Then
txtUnit2.Text = ""
ElseIf cboUnitType.SelectedItem = "Length" Then
suppressTextBox2TextChanged = True
txtUnit2.Text = GetLength1(decUnit1)
suppressTextBox2TextChanged = False
End If
End If
End Sub
答案 0 :(得分:1)
堆栈跟踪有助于精确定位发生错误的行。
但是,从我所看到的,错误发生在GetLength1函数的最后一行。您正在返回一个字符串,但该函数被声明为返回一个Decimal。
因此,如果结果为零,则为以下行:
Return decResult1.ToString("N").Trim("0")
将修剪零,留下一个空字符串,不能转换为十进制(函数的返回类型)。
我建议您将GetLength1
的返回类型更改为String:
Private Function GetLength1(ByVal decLengthUnit1 As Decimal) As String
答案 1 :(得分:1)
您发布的代码中有几个问题。 GetLength1
不完整,缺少ELSE或END IF。其次,这不完全正确:
If txtUnit1.Text = "" OrElse txtUnit1.Text = "-" Then
txtUnit2.Text = ""
ElseIf cboUnitType.SelectedItem = "Length" Then
...
End If
乍一看这些并不是互相排斥的,因此它所要处理的特殊情况可能并不总是得到解决。他们可能会更好地独立Ifs
。
接下来,Decimal.TryParse(txtUnit1.Text, decUnit1)
返回一个T / F值,指示转换是否可行,但您不评估它。由于十进制结果(decunit1
)将被发送到数学例程,如果它不是有效值,则可能会中止其余的过程。
主要问题在于您的GetLength1
功能。它被声明为Decimal,但是您预计将如何使用其他地方并尝试在返回时转换为字符串。启用Option Explicit,将标记这些类型的错误。将GetLength保留为正确的小数,以避免将其转换回某处的数字,并在显示时将其转换为字符串。
Private Function GetLength1(ByVal decLengthUnit1 As Decimal) As Decimal
...
Return decResult1
End Function
使用它:
txtUnit2.Text = GetLength1(decUnit1).ToString
错误消息msg以及告诉你所有内容:将数字.01
转换为返回的字符串,防止VB在某些情况下将其隐式地转换为Decimal返回。你试图将一个十进制转换/转换成一个字符串回到十进制。