输入引导零点或小数点时出错

时间:2013-12-01 14:39:23

标签: .net vb.net visual-studio

我有一个使用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

2 个答案:

答案 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返回。你试图将一个十进制转换/转换成一个字符串回到十进制。