“从字符串”“转换为”双重“类型无效”

时间:2014-12-11 06:49:18

标签: vb.net type-conversion

我正在微软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
&#13;
&#13;
&#13;

该脚本用于计算标记并在点击名为&#34;确认&#34;的按钮后给出评分。

然而,当我试图运行编码时,它说:

未处理的类型&#39; System.InvalidCastException&#39;发生在Microsoft.VisualBasic.dll

其他信息:从字符串转换&#34;&#34;输入&#39; Double&#39;无效。

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

P.S。编辑了最近的剧本。

P.S。感谢您的用户&#34; Tim&#34;对于脚本但由于某些未知原因在线上&#34; Double.TryParse(caMarks.Text,caMarks)&#34;这是一个蓝色的波浪形,指向caMarks说&#34;&#39; Text&#39;不是&#39; double&#39;&#34;的成员。这实际上是在拉我的头发!请帮忙!

看起来对象的名称存在冲突。

2 个答案:

答案 0 :(得分:2)

正如Idle_Mind在答案中所说,Double.TryParse是要走的路。这提供了一种尝试将值转换为double的安全方法。如果转换成功,则该方法返回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参数作为第二个参数,并且必须在使用它之前声明。您可以使用一个变量(并重复使用它),但为了简单起见,我为每个分数选择了一个。

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

希望这能为您澄清事情。

答案 1 :(得分:0)

因为您要为此变量指定字母等级 ... 更改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