2014-12-11 4 views
1

Я делаю проект в Visual Studio 2012 Microsoft, и я пытаюсь написать приложение для определения среднего значения модуля.«Преобразование из строки» «для типа« Двойной »недействителен»

Сценарий следующий:

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

Скрипт предназначен для расчета марок и дать оценку после нажатия на кнопку с именем «Подтвердить».

Однако, когда я попытался запустить кодирование он сказал:

Необработанное исключение типа «System.InvalidCastException» произошло в Microsoft.VisualBasic.dll

Дополнительная информация: Преобразование из строки «» в тип «Двойной» недействителен.

Может кто-то увидеть, что не так? Я новичок в Visual Studio, и я ценю вашу помощь.

P.S. отредактировал недавний скрипт

P.S. Спасибо за пользователя «Тим» за скрипт , но по какой-то неизвестной причине в строке «Double.TryParse (caMarks.Text, caMarks)» есть синяя squiggly, которая направляет caMarks, в которой говорится: «Text» не является членом «двойного». Это буквально тянет мои волосы! пожалуйста помоги!

Похоже, что имена объектов противоречивы.

+1

Хорошо - что не так, что вы где-то пытаетесь преобразовать «» в двойной. Вероятно, в одном из вызовов CDbl (*. Text). Отлаживайте свой код и узнайте, какой. –

+0

Я отлаживал и сказал, что строка «sum = CDbl (test.Text) * 50% + CDbl (project.Text) * 30% + CDbl (quiz.Text) * 30%« неверно. Постскриптум Я попытался превратить раздел «Dim Grade As Integer» в «Dim Grade As Double», и он все еще не работает. какие-либо предложения? –

+0

Вы вводили данные во все поля? Вы не можете оставить пробелы и предположить, что они будут установлены в 0. – NoChance

ответ

0

Поскольку вы назначая буквенную этой переменной ... Изменить Dim Grade As Integer к Dim 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 
+0

Не работает, никакого эффекта. –

+0

Вам нужно перейти от всех вызовов CDbl() к соответствующим вызовам Double.TryParse(). Посмотрите это ... –

+1

Кроме того, неясно, правильно ли вы используете «50%». Вы, скорее всего, имели в виду «.5». Символ «%» приводит к тому, что 50 рассматривается как целое число, которое оно уже есть. См. [Типовые символы (Visual Basic)] (http://msdn.microsoft.com/en-us/library/s9cz43ek.aspx). –

1

Как сказал Idle_Mind в своем ответе, Double.TryParse это путь. Это обеспечивает безопасный способ попытаться преобразовать значение в double. Если преобразование завершается успешно, метод возвращает true, и полученный двойной результат возвращается в параметр out. Если преобразование завершается неудачно, возвращается 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.TryParse принимает в качестве второго аргумента параметр out и должен быть объявлен перед его использованием. Вы можете использовать одну переменную (и повторно использовать ее), но для простоты я выбрал по одному для каждого балла.

После того, как результаты были проанализированы (успешно или нет), определяются совокупные взвешенные итоговые значения.Обратите внимание, что круглые скобки использовались при применении модификатора веса, чтобы гарантировать, что приоритет оператора не даст вам результата, кроме ожидаемого.

Надеюсь, это прояснит вам все.

+0

Теперь на строке «Double.TryParse (CAMarks.Text, CAMarks)» есть ошибка, которая гласит: «« Текст »не является членом« Двойной », и только на этой строке и на CAmarks без какой-либо видимой причины , без этого проблем нет. как только я попытался получить эту строку, она появляется. –

+0

Забытый VB.NET не учитывает регистр. Измените двойные 'caMarks' на' метки' и повторите попытку. Причина, по которой вы получили ошибку, заключалась в том, что VB.NET видел 'CAMarks' (текстовое поле) и' caMarks' (двойное) как одно и то же имя. – Tim

Смежные вопросы