0

我不断收到这条烦人的消息(即使这是我的错):

从字符串“”到类型“Double”的转换无效。

当我在 VB 2010 Express 中调试并点击“SLM”按钮时,我收到此消息。这到底是什么意思,我做错了什么?!?!

我的代码:

Public Class frmAssignment_5

    Private Sub btnSLM_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSLM.Click
        Dim Description As String
        Dim Year As String
        Dim Life As String
        Dim SLMDepreciation As String
        Dim SLMText As String = "straight-line"

        txtDescription.Clear()
        txtYear.Clear()
        txtCost.Clear()
        txtLife.Clear()
        lstResult.ClearSelected()

        Description = CStr(txtDescription.Text)
        Year = CStr(txtYear.Text)
        Life = CStr(txtLife.Text)
        SLMDepreciation = CStr(SLMD())

        lstResult.Items.Add("Description: " & Description)
        lstResult.Items.Add("Year of purchase: " & Year)
        lstResult.Items.Add("Cost: " & FormatCurrency(CStr(txtCost.Text), 2))
        lstResult.Items.Add("Estimated life: " & Life)
        lstResult.Items.Add("Method of depreciation: " & SLMText)


    End Sub

    Function SLMD() As Double
        Dim Salvage_Value As Integer = 0
        Dim Life As String = CStr(txtLife.Text)
        Dim Cost As String = CStr(txtCost.Text)

        SLMD = (CDbl(txtCost.Text) - Salvage_Value) / CDbl(Life)

        Return SLMD
    End Function
End Class

错误在“SLMD = (CDbl(txtCost.Text) - Salvage_Value) / CDbl(Life)”处不断发生,但是当我改变周围的东西时,它开始指向我用相同错误改变的东西。

如果有人可以帮助我,我将永远欠债......

4

3 回答 3

4

VB 抱怨是因为您试图将空字符串“”值转换为数字。如果将 VAL() 放在每个字符串周围,它会将其转换为零。

Salvage_Value 也被声明为 Integer,但您将其用作 Double,因此在计算 SLMD 时也需要对其进行转换:

SLMD = (Val(txtCost.Text) - CDbl(Salvage_Value)) / Val(Life)

如果“Life”未设置为某个值,您还有被零除的风险,因此您应该添加代码以确保在此处输入了一个值。

于 2012-07-16T02:37:03.160 回答
3

这与我刚刚回答的一个问题非常相似。当您使用 CDbl 转换字符串时,如果无法进行转换,则会出错,我要做的是使用Double.TryParse并单独设置值,然后如果出现错误,我会处理它。

Function SLMD() As Double
    Dim Salvage_Value As Integer = 0
    Dim Life As Double
    Dim Cost As Double
    If Not Double.TryParse(txtLife.Text, Life) Then
        'Do something to handle error
    End If
    If Not Double.TryParse(txtCost.Text, Cost) Then
        'Do something to handle error
    End If

    Return (Cost - Salvage_Value) / Life

End Function
于 2012-07-16T02:44:26.353 回答
0

在我看来,您正在尝试将空String( "") 转换为Doubleat CDbl(txtCost.Text)。这不是有效的转换,因为“ ”不是有效值Double

我认为您应该在尝试转换之前检查txtCost.Text它是否实际上是Double表示为 a 。String您可以尝试阻止来自客户端的无效字符/值,或者在收到它之后(但在尝试转换之前)从服务器检查它。另一种选择是在try+catch+finally语句中处理它。这篇文章也可能对您遇到的情况有所帮助。

于 2012-07-16T02:40:37.987 回答