2010-01-25 2 views
0

Я хочу рассчитать процент. Но компилятор сообщает об ошибке, что входная строка не в правильном формате. Может кто-то уточнить, чего я здесь не вижу?входная строка не в правильном формате

private double per() 
{ 
    double a = Convert.ToDouble(tbEnglish.Text+tbUrdu.Text+tbPhysics.Text+tbChemistry.Text+tbMaths.Text); 
    double d = 500; 
    double lblResult = (a/d)*100; 
    return lblResult; 
} 

ответ

4

Вы объединяете строки, а затем пытаетесь преобразовать этот результат в двойной. Таким образом, для результатов 75.6, 92.1, 56.3 78.2 и 72.3 вы попытаетесь разобрать «75.692.156.378.272.3».

Разбирайте каждое значение, а затем суммируйте его.

Однако я бы настоятельно рекомендовал использовать для этого decimal вместо double. Вы также должны использовать TryParse вместо Parse, чтобы вы могли корректно обрабатывать ошибки ввода. Вот решение придерживающегося Parse:

public decimal AveragePercentage() 
{ 
    decimal sum = decimal.Parse(tbEnglish.Text) + 
        decimal.Parse(tbUrdu.Text) + 
        decimal.Parse(tbPhysics.Text) + 
        decimal.Parse(tbChemistry.Text) + 
        decimal.Parse(tbMaths.Text); 
    return sum/5m; 
} 

из интереса, в исходном коде, почему вы разделив на 500, а затем умножение на 100? Почему бы просто не разделить на 5 (как мое сейчас, что я заметил, что происходит)?

Как примечание стороны, это очень важно различать компиляции времени ошибок и выполнения времени ошибок. Он не был, компилятор сказал, что входная строка не была в правильном формате - это был метод Convert.ToDouble во время выполнения. В этом случае это было относительно очевидно, но в других ситуациях мы могли бы некоторое время преследовать наши хвосты, пытаясь найти проблему времени компиляции, когда она фактически не срабатывала во время выполнения.

+0

Я чувствую себя идиотом за вопрос, но что такое синтаксис «500 м»? Что такое «м»? – Sapph

+0

@Sapph: Указывает числовой литерал типа 'decimal'. (т. е. это десятичный эквивалент 'd' для double или' f' для float) –

+0

Очень полезно знать, спасибо! – Sapph

0

У меня нет Visual Studio, доступной мне здесь, на моем Linux-боксе, но я думаю, что вам лучше с кодом вроде этого.

private double per() 
{ 
    double a = Convert.ToDouble(tbEnglish.Text); 
    a += Convert.ToDouble(tbPhysics.Text); 
    a += Convert.ToDouble(tbChemistry.Text); 
    a += Convert.ToDouble(tbMaths.Text); 
    double d = 500; 
    double lblResult = (a/d)*100; 
    return lblResult; 
} 

В вашем примере, вы в конечном итоге создание строки, который будет выглядеть примерно так: «75.692.156.372.3», который не может быть разобрано в два раза.

Вам необходимо преобразовать все значения TextBox.Text в десятичные числа перед использованием оператора +.

+0

@ Доминичный ваш фрагмент не работает тоже ..:/Я думаю, что есть проблема с моим кодом ... – Abid

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