Vb.net 零或十进制作为用户输入?
我有一个使用Visual Studio 2013用Visual Basic编写的单元转换器。在用户输入零(0)或以十进制(.)开头之前,程序工作正常。我收到此错误消息:从字符串“”到类型“Decimal”的转换无效。如何让该程序接受零和/或小数点作为用户的初始输入,而不会导致程序崩溃?代码如下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
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-谢谢你的更新。不幸的是,第一行是用户在两侧选择相同单位进行转换的实例。就像他们选择公里来转换成公里一样。我是这样做的,这样就等于用户的输入。