Vb.net 零或十进制作为用户输入?

Vb.net 零或十进制作为用户输入?,vb.net,visual-studio-2013,Vb.net,Visual Studio 2013,我有一个使用Visual Studio 2013用Visual Basic编写的单元转换器。在用户输入零(0)或以十进制(.)开头之前,程序工作正常。我收到此错误消息:从字符串“”到类型“Decimal”的转换无效。如何让该程序接受零和/或小数点作为用户的初始输入,而不会导致程序崩溃?代码如下 Private Function GetLength1(ByVal decLengthUnit1 As Decimal) As Decimal Dim decResult1 As Decimal

我有一个使用Visual Studio 2013用Visual Basic编写的单元转换器。在用户输入零(0)或以十进制(.)开头之前,程序工作正常。我收到此错误消息:从字符串“”到类型“Decimal”的转换无效。如何让该程序接受零和/或小数点作为用户的初始输入,而不会导致程序崩溃?代码如下

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 = "Kilometer" Then
                decResult1 = txtUnit1.Text
            ElseIf cbo2.SelectedItem = "Meter" Then
                decResult1 = (decLengthUnit1 * 1000)
            ElseIf cbo2.SelectedItem = "Centimeter" Then
                decResult1 = (decLengthUnit1 * 100000)
            ElseIf cbo2.SelectedItem = "Millimeter" Then
                decResult1 = (decLengthUnit1 * 1000000)
            ElseIf cbo2.SelectedItem = "Mile" Then
                decResult1 = (decLengthUnit1 * 0.621371191)
            ElseIf cbo2.SelectedItem = "Yard" Then
                decResult1 = (decLengthUnit1 * 1093.613297)
            ElseIf cbo2.SelectedItem = "Foot" Then
                decResult1 = (decLengthUnit1 * 3280.83989)
            ElseIf cbo2.SelectedItem = "Inch" Then
                decResult1 = (decLengthUnit1 * 39370.07868)
            End If
        End If
    End If

    If decResult1 < 0 Then
        txtUnit2.ForeColor = Color.Red
    ElseIf decResult1 >= 0 Then
        txtUnit2.ForeColor = Color.Green
    End If

    Return decResult1.ToString().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

        ElseIf cboUnitType.SelectedItem = "Pressure" Then


        ElseIf cboUnitType.SelectedItem = "Temperature" Then
            suppressTextBox2TextChanged = True
            txtUnit2.Text = GetTemp1(decUnit1)
            suppressTextBox2TextChanged = False

        End If
    End If

End Sub
专用函数GetLength1(ByVal DeClingthUnit1为十进制)为十进制
Dim decResult1为十进制
如果cbounitype.SelectedItem=“Length”,则
'将公里转换为。。。
如果cbo1.SelectedItem=“km”,则
如果cbo2.SelectedItem=“km”,则
declesult1=txtUnit1.Text
ElseIf cbo2.SelectedItem=“Meter”然后
decResult1=(decLengthUnit1*1000)
ElseIf cbo2.SelectedItem=“厘米”然后
Declesult1=(Declenshunit1*100000)
ElseIf cbo2.SelectedItem=“毫米”然后
Declesult1=(decLengthUnit1*1000000)
ElseIf cbo2.SelectedItem=“Mile”然后
Declesult1=(Declenshunit1*0.621371191)
ElseIf cbo2.SelectedItem=“Yard”然后
Declesult1=(Declenshunit1*1093.613297)
ElseIf cbo2.SelectedItem=“Foot”然后
Declesult1=(Declenshunit1*3280.83989)
ElseIf cbo2.SelectedItem=“Inch”然后
Declesult1=(Declenshunit1*39370.07868)
如果结束
如果结束
如果结束
如果decResult1小于0,则
txtUnit2.ForeColor=颜色。红色
否则,如果decResult1>=0,则
txtUnit2.ForeColor=颜色.绿色
如果结束
Return decResult1.ToString().Trim(“0”)
端函数
私有子txtUnit1_TextChanged(发送方作为对象,e作为事件参数)处理txtUnit1.TextChanged
如果suppressTextBox1TextChanged=False,则
'将字符串转换为数字数据类型
Decimal.TryParse(txtUnit1.Text,decUnit1)
'句柄字符串。为空或负号
如果txtUnit1.Text=“”或lse txtUnit1.Text=“-”则
txtUnit2.Text=“”
ElseIf cboUnitType.SelectedItem=“Length”然后
suppressTextBox2TextChanged=True
txtUnit2.Text=GetLength1(decunt1)
suppressTextBox2TextChanged=False
ElseIf cboUnitType.SelectedItem=“压力”然后
ElseIf cboUnitType.SelectedItem=“温度”然后
suppressTextBox2TextChanged=True
txtUnit2.Text=GetTemp1(decunt1)
suppressTextBox2TextChanged=False
如果结束
如果结束
端接头

使用
System.Convert.ToDecimal()
而不只是将文本框值赋给
Decimal
变量,如下所示:

decResult1 = Convert.ToDecimal(txtUnit1.Text)
Dim number As Decimal

If Decimal.TryParse(txtUnit1.Text, number) Then
    ' Successfully cast text box text to a Decimal
Else
    ' Unable to cast text box text to a Decimal      
End If

正如Ahmed在评论中指出的那样,使用
Decimal.TryParse()
可以避免异常情况,即如果强制转换失败,
System.Convert.ToDecimal()
将抛出异常,如下所示:

decResult1 = Convert.ToDecimal(txtUnit1.Text)
Dim number As Decimal

If Decimal.TryParse(txtUnit1.Text, number) Then
    ' Successfully cast text box text to a Decimal
Else
    ' Unable to cast text box text to a Decimal      
End If
更新:

以下是您的代码:

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 = "Kilometer" Then
                Decimal.TryParse(txtUnit1.Text, decResult1)
            ElseIf cbo2.SelectedItem = "Meter" Then
                decResult1 = (decLengthUnit1 * 1000)
            ElseIf cbo2.SelectedItem = "Centimeter" Then
                decResult1 = (decLengthUnit1 * 100000)
            ElseIf cbo2.SelectedItem = "Millimeter" Then
                decResult1 = (decLengthUnit1 * 1000000)
            ElseIf cbo2.SelectedItem = "Mile" Then
                decResult1 = (decLengthUnit1 * 0.621371191)
            ElseIf cbo2.SelectedItem = "Yard" Then
                decResult1 = (decLengthUnit1 * 1093.613297)
            ElseIf cbo2.SelectedItem = "Foot" Then
                decResult1 = (decLengthUnit1 * 3280.83989)
            ElseIf cbo2.SelectedItem = "Inch" Then
                decResult1 = (decLengthUnit1 * 39370.07868)
            End If
        End If
    End If

    If decResult1 < 0 Then
        txtUnit2.ForeColor = Color.Red
    ElseIf decResult1 >= 0 Then
        txtUnit2.ForeColor = Color.Green
    End If

    Return decResult1.ToString().Trim("0")
End Function
专用函数GetLength1(ByVal DeClingthUnit1为十进制)为十进制
Dim decResult1为十进制
如果cbounitype.SelectedItem=“Length”,则
'将公里转换为。。。
如果cbo1.SelectedItem=“km”,则
如果cbo2.SelectedItem=“km”,则
Decimal.TryParse(TxUnit1.Text,decResult1)
ElseIf cbo2.SelectedItem=“Meter”然后
decResult1=(decLengthUnit1*1000)
ElseIf cbo2.SelectedItem=“厘米”然后
Declesult1=(Declenshunit1*100000)
ElseIf cbo2.SelectedItem=“毫米”然后
Declesult1=(decLengthUnit1*1000000)
ElseIf cbo2.SelectedItem=“Mile”然后
Declesult1=(Declenshunit1*0.621371191)
ElseIf cbo2.SelectedItem=“Yard”然后
Declesult1=(Declenshunit1*1093.613297)
ElseIf cbo2.SelectedItem=“Foot”然后
Declesult1=(Declenshunit1*3280.83989)
ElseIf cbo2.SelectedItem=“Inch”然后
Declesult1=(Declenshunit1*39370.07868)
如果结束
如果结束
如果结束
如果decResult1小于0,则
txtUnit2.ForeColor=颜色。红色
否则,如果decResult1>=0,则
txtUnit2.ForeColor=颜色.绿色
如果结束
Return decResult1.ToString().Trim(“0”)
端函数

仅添加-使用TryParse方法查看它是否成功解析,而不是在无法解析时引发异常(例如输入不是十进制输入而是文本/文字输入,如“abc123”),我是在GetLength1()函数中使用它,还是在TextChanged事件中使用它?Declesult1=Convert.ToDecimal(txtUnit1.Text)@Zack-
GetLength1()
@KarlAnderson-我很难理解你的建议。你能编辑我的代码并发布吗?提前谢谢。@KarlAnderson-谢谢你的更新。不幸的是,第一行是用户在两侧选择相同单位进行转换的实例。就像他们选择公里来转换成公里一样。我是这样做的,这样就等于用户的输入。