Строка преобразования в Double недействительна в VB

У меня проблема с попыткой поймать в VB. У меня есть 2 кнопки (btnCalculate, btnPay) и 3 метки (lblTotal, lblCash, lblChange)

btnCalculate = общая цена
btnPay = сумма, уплаченная клиентом

lblTotal = отображать общую стоимость
lblCash = отображать наличные, уплаченные клиентом
lblChange = отображать сдачу

EDIT: Преобразование из строки в тип Double недопустимо, ошибка

Private Sub btnPay_Click(sender As Object, e As EventArgs) Handles btnPay.Click
    Dim payAmount As Double
    Dim total As Double
    total = CDbl(lblTotal.Text)

    Do While (payAmount < total)
        payAmount = Val(InputBox("Enter customer pay amount: "))
        If (payAmount < total) Then
            MessageBox.Show("Please pay the amount of total bill!")
        Else
            lblCash.Text = "$" & CStr(payAmount)
            lblChange.Text = "$" & CStr(payAmount - total)
        End If
    Loop
End Sub

person Sollo    schedule 26.12.2014    source источник
comment
Это очень неправильная отчетность об исключениях, это сообщение о том, что это не сработало, без сообщения кому-либо, почему это не сработало. Таким образом, вы не знаете, почему это не работает, и не можете знать, как это исправить. Никогда не скрывайте причину исключения.   -  person Hans Passant    schedule 26.12.2014
comment
payAmount - lblTotal.Text – Используйте Строгий параметр.   -  person The Blue Dog    schedule 26.12.2014
comment
Я просто сообщаю об ошибке, она показывает, что мое значение lblTotal.Text для типа Double недействительно. @TheBlueDog, я только что включил его, и у него все та же проблема.   -  person Sollo    schedule 26.12.2014
comment
Я думаю, вам лучше выяснить, почему тогда. Option Strict не устраняет проблемы за вас волшебным образом, а просто предотвращает попытки сделать то, что вы не должны делать с самого начала. СОВЕТ.   -  person The Blue Dog    schedule 26.12.2014
comment
Я пойду лучше и посоветую вам удалить блокировку попытки, пусть программа выйдет из строя, чтобы вы знали, в чем проблема, чтобы ее можно было исправить. Преобразование текстовых полей в числовые не требует Try/Catch, а Try/Catch не проверяет данные.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.12.2014
comment
@Plutonix Спасибо за совет! Я понял. Я борюсь с этой ошибкой.   -  person Sollo    schedule 26.12.2014
comment
Что имеет lblTotal.text при возникновении исключения?   -  person Josh Part    schedule 26.12.2014
comment
@JoshPart Я только что удалил попытку и улов, и нет необходимости добавлять его, как упоминалось выше plutonix. Но у меня все еще есть ошибка для total = CDbl(lblTotal.Text) строки, преобразованной в двойную, недействительной.   -  person Sollo    schedule 26.12.2014
comment
что точно указано в ярлыке, когда он терпит неудачу? И в какой вы стране?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.12.2014
comment
Посмотрите, все очень просто — либо lblTotal.Text — это пустая строка, либо она содержит символы, которые невозможно преобразовать в число.   -  person The Blue Dog    schedule 26.12.2014
comment
@TheBlueDog да, он содержит $. Как исключить этот знак?   -  person Sollo    schedule 26.12.2014
comment
вы в США или Канаде? (это не фривольный вопрос!) Франция, например, не отличает $ от круассана.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.12.2014
comment
В конце концов. Полностью удалите его из текстового поля и добавьте как отдельную метку в форму или что-то в этом роде.   -  person The Blue Dog    schedule 26.12.2014
comment
@Plutonix Я не из этих двух стран. Мне просто любопытно, почему мой друг получил ошибку при компиляции кода выше, но я не получаю никаких ошибок.   -  person Sollo    schedule 26.12.2014
comment
хорошо, если в вашей стране не используются доллары, не показывайте знаки доллара. В любом случае неправильно приклеивать $ к CSTR - это должно быть payamount.ToString("C2"), а переменные, вероятно, должны быть Decimal. Использование символа местной валюты позволит коду работать (отчасти). Decimal.Parse будет лучше, чем CDbl/CDec   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.12.2014
comment
@Plutonix Это только для моих индивидуальных целей обучения, а не для бизнес-объектов, потому что я просто новичок в VB. Я попробую после этого. Спасибо за ваши идеи :)   -  person Sollo    schedule 26.12.2014
comment
Это не имеет значения — если ваш компьютер не использует американскую нотацию, такую ​​как значения $, содержащие его, это будет выглядеть недействительным. Вот как CDBL и Decimal.Parse знают, как анализировать различные символы валюты: они знают местную культуру. Если это для learning purposes, тем больше причин научиться делать это правильно.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.12.2014
comment
@Plutonix Спасибо за ваше предложение, я имею в виду, что сделаю это, как только решу эту проблему. The Blue Dog только что упомянул, где моя проблема, и НАКОНЕЦ решить эту проблему. Большое спасибо! = Д   -  person Sollo    schedule 26.12.2014


Ответы (1)


Проблема в том, что вы отбрасываете настоящую причину ошибки. Посмотрите, что делает ваша программа:

  • Введен неверный номер: отображается сообщение Введите действительный номер!.
  • Системе не хватает памяти: Пожалуйста, введите действительный номер!.
  • Вы допустили ошибку программирования: отображается сообщение Пожалуйста, введите правильный номер!.
  • Что-то еще пошло не так: Пожалуйста, введите правильный номер!.

Это нехорошо, не так ли? На самом деле вы хотите показывать сообщение «Пожалуйста, введите действительное число» только тогда, когда было введено недопустимое число, поэтому не выполняйте обработку исключений Pokemon: поместите обработку исключений вокруг оператора, где вы ожидаете возникновения ошибки и перехватываете только то конкретное исключение, которое вам нужно.

Если вы выполняете глобальную обработку исключений, включите ex.Message в отображаемое сообщение об ошибке, чтобы убедиться, что можно определить настоящую причину ошибки.

person Heinzi    schedule 26.12.2014