【问题标题】:"Conversion from string " " to type 'Double' is not valid"“从字符串“”到类型“Double”的转换无效”
【发布时间】:2015-02-09 14:07:33
【问题描述】:

我正在 microsoft visual studio 2012 中做一个项目,我正在尝试编写一个应用程序来确定模块平均值。

脚本如下:

 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles confirm.Click
        Dim sum As Double
        sum = CDbl(test.Text) * 50% + CDbl(project.Text) * 30% + CDbl(quiz.Text) * 30%
        Dim modulemark As Double
        modulemark = CDbl(CAmarks.Text) * 50% + CDbl(exam.Text) * 50%

        Dim Grade As String
        If sum < 40 Then
            Grade = "F"
        ElseIf sum >= 40 And modulemark < 65 And modulemark >= 40 Then
            Grade = "C"
        ElseIf sum >= 40 And modulemark < 75 And modulemark >= 65 Then
            Grade = "B"
        Else
            Grade = "A"
        End If

该脚本旨在计算分数并在单击名为“确认”的按钮后给出评分。

但是,当我尝试运行编码时,它说:

Microsoft.VisualBasic.dll 中出现“System.InvalidCastException”类型的未处理异常

附加信息:从字符串“”到类型“Double”的转换无效。

有人能看出什么问题吗?我是 Visual Studio 的新手,感谢您的帮助。

附:编辑最近的脚本。

附:感谢用户“Tim”的脚本,但由于某些未知原因,在“Double.TryParse(caMarks.Text, caMarks)”这一行有一个蓝色波浪线指向 caMarks,上面写着“'Text' 不是“双重”的成员”。这简直是​​在扯我的头发!请帮忙!

看起来对象的名称有冲突。

【问题讨论】:

  • 嗯 - 问题是你在某个地方试图将 "" 转换为双精度。可能在 CDbl(*.text) 调用之一中。调试您的代码并找出哪个。
  • 我调试了,它说“sum = CDbl(test.Text) * 50% + CDbl(project.Text) * 30% + CDbl(quiz.Text) * 30%”这行是错误的.附言我尝试将“Dim Grade As Integer”部分变成“Dim Grade As Double”,但它仍然不起作用。有什么建议吗?
  • 您是否在所有字段中都输入了数据?您不能留空并假设它们将被设置为 0。
  • 是的。但是,我还没有进行验证。但是我插入了未显示且不完整的学生姓名,我稍后会做,所有 4 个部分(测试、测验、项目、考试),但它仍然不起作用。
  • 要确定错误的确切来源,请尝试为每个变量创建一个 Double 类型的单独变量,例如 Dim CMarks as Double: CMarks=CDBL(CMarks.Text) 等等,然后运行您的程序。这将显示导致问题的语句(最好使用调试模式)。

标签: vb.net type-conversion


【解决方案1】:

正如 Idle_Mind 在他们的回答中所说,Double.TryParse 是要走的路。这提供了一种尝试将值转换为双精度值的安全方法。如果转换成功,则该方法返回 true,并在 out 参数中返回结果 double。如果转换失败,则返回 false 并返回默认值 double(即 0)。

一个简单的例子:

Dim result As Double
Dim score As String = "75"

If Double.TryParse(score, result) Then
   ' result will be a double with the value of 75
Else
   ' The conversion attempt failed, and result will have a value of 0
End If

因此将其应用于您的方法(没有验证,尽管 Idle_Mind 的回答提供了一个很好的方法):

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles confirm.Click

    Dim sum As Double
    Dim modulemark As Double
    Dim testScore As Double
    Dim projectScore As Double
    Dim quizScore As Double
    Dim marks As Double
    Dim examScore As Double

    Double.TryParse(test.Text, testScore)
    Double.TryParse(project.Text, projectScore)
    Double.TryParse(quiz.Text, quizScore)
    Double.TryParse(CAmarks.Text, marks)
    Double.TryParse(exam.Text, examScore)

    sum = (testScore * .5) + (projectScore * .3) + (quizScore * .3)
    modulemark = (marks * .5) + (examScore * .5)

    Dim Grade As String

    If sum < 40 Then
        Grade = "F"
    ElseIf sum >= 40 And modulemark < 65 And modulemark >= 40 Then
        Grade = "C"
    ElseIf sum >= 40 And modulemark < 75 And modulemark >= 65 Then
        Grade = "B"
    Else
        Grade = "A"
    End If
End Sub

上面代码的解释。

首先,声明了 6 个 Double 变量 - 这是必要的,因为 Double.TryParseout 参数作为第二个参数,并且必须在使用之前声明。您可以使用一个变量(并重复使用它),但为简单起见,我为每个分数选择了一个。

一旦分数被解析(成功与否),就会确定累积的加权总数。请注意,在应用权重修饰符时使用了括号,以确保运算符优先级不会给您带来预期之外的结果。

希望这可以为您澄清一些事情。

【讨论】:

  • 现在,在“Double.TryParse(CAMarks.Text, CAMarks)”这行有一个错误提示:“'Text' is not a member of 'Double'”,并且仅在该行和 CAmarks 没有任何明显的理由。没有它就没有问题。一旦我尝试输入该行,它就会出现。
  • 忘记了 VB.NET 不区分大小写。将双 caMarks 更改为 marks 并重试。您收到错误的原因是因为 VB.NET 将 CAMarks(文本框)和 caMarks(双精度)视为同名。
【解决方案2】:

因为您要为这个变量分配一个字母等级... 更改Dim Grade As IntegerDim Grade As String

Double.TryParse() 示例:

    Dim testValue As Double, projectValue As Double, quizValue As Double
    If Double.TryParse(test.Text, testValue) Then
        If Double.TryParse(project.Text, projectValue) Then
            If Double.TryParse(quiz.Text, quizValue) Then
                Dim sum As Double
                sum = testValue * 0.5 + projectValue * 0.3 + quizValue * 0.3
                ' ... do something with "sum" ...
            Else
                MessageBox.Show(quiz.Text, "Invalid Quiz Score")
            End If
        Else
            MessageBox.Show(project.Text, "Invalid Project Score")
        End If
    Else
        MessageBox.Show(test.Text, "Invalid Test Score")
    End If

【讨论】:

  • 您需要从使用所有这些 CDbl() 调用转移到正确的 Double.TryParse() 调用。查一下……
  • 此外,尚不清楚您对“50%”的使用是否正确。您最有可能的意思是“.5”。 “%”符号导致 50 被视为一个整数,它已经是一个整数。见Type Characters (Visual Basic)
  • 试过了。它说:“重载解析失败,因为没有可访问的 tryparse 接受这个数量的参数。”脚本是:“modulemark = Double.TryParse(CAmarks.Text) * 50% + Double.TryParse(exam.Text) * 50%”。暗淡已经设置为双倍。
猜你喜欢
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多