Преобразование в тип Double недопустимо?

У меня ошибка в VB.net If CurrencyHolder.Text > 0 And CurrencyHolder.Text < 10000 Then

Я использую Maskedinputbox 00000.00. Когда я выполняю свой код, а Maskedinputbox пуст, я получаю следующую ошибку:

**Старался перевести как мог!!!:$ ) Преобразование знаковой полосы . вводить double недопустимо

Как я могу это исправить?


person TheBlinderCoder    schedule 07.01.2016    source источник


Ответы (2)


Вы можете использовать val(): - Возвращает числа, содержащиеся в строке, в виде числового значения соответствующего типа.

If Val(CurrencyHolder.Text) > 0 AndAlso Val(CurrencyHolder.Text) < 1000 Then
            'code
        End If

предостережения

val() рассмотреть только . для проверки десятичного разделителя, если стиль десятичной точки конечного пользователя lcoale отличается от . это не будет работать

person Vivek S.    schedule 07.01.2016
comment
Привет Wingedpanther, это работает! Но я не знаю, почему это работает. Не могли бы вы объяснить мне это :)? - person TheBlinderCoder; 07.01.2016
comment
@TheBlinderCoder Обновлено!! - person Vivek S.; 07.01.2016
comment
но это вызовет ошибку времени выполнения, если пользователь введет символы, которые нельзя преобразовать. - person 5uperdan; 07.01.2016
comment
@ 5uperdan К вашему сведению, маскированное текстовое поле с маской 00000.00 будет принимать только числовые значения. - person Vivek S.; 07.01.2016
comment
Почему Val, а не .NET? Используйте Double.Parse/Double.TryParse или Decimal.Parse/Decimal.TryParse. - person Tim Schmelter; 07.01.2016
comment
@TimSchmelter Функция Val распознает только точку (.) в качестве допустимого десятичного разделителя (согласно doc), поэтому, когда дело доходит до требования OP, его ввод находится в том же формате, что и 00000.00, поэтому val() приходит мне на ум OTOH для разных десятичных разделителей, мы можем использовать вышеупомянутые методы - person Vivek S.; 07.01.2016
comment
Вы также можете использовать эти методы, если хотите поддерживать . в качестве десятичного разделителя. Dim valid As Boolean = Decimal.TryParse(CurrencyHolder.Text, NumberStyles.Currency, NumberFormatInfo.InvariantInfo, currency). Вы также можете передать объект CultureInfo вместо NumberFormatInfo.InvariantInfo для поддержки определенных валют. - person Tim Schmelter; 07.01.2016
comment
@TimSchmelter Заметил и проверю позже. - person Vivek S.; 07.01.2016
comment
Val не является хорошим выбором, потому что вы не знаете, будет ли языковой стандарт конечного пользователя использовать . или другой символ в качестве десятичного разделителя. Если он использует другой символ, Val потерпит неудачу. Указание . для десятичного разделителя maskedtextbox не гарантирует, что он всегда будет отображаться: фактический отображаемый символ будет десятичным символом, соответствующим поставщику формата. - person Matt Wilko; 07.01.2016

Используйте Double.Parse/Double.TryParse или Decimal.Parse/Decimal.TryParse. Для валют Decimal является правильным типом.

Dim currency as Decimal
Dim valid as Boolean = Decimal.TryParse(CurrencyHolder.Text, currency)

If valid AndAlso currency > 0 AndAlso currency < 10000 Then
    ' ... '
End If

https://msdn.microsoft.com/en-us/library/system.decimal.tryparse(v=vs.110).aspx

Если ваш текущий десятичный разделитель отличается от того, который вы хотите поддерживать (например, вы используете 123,50€, но значение, которое вы должны проанализировать, равно 123.50$), вы можете использовать перегрузку методов анализа. Например:

Dim valid As Boolean = Decimal.TryParse(CurrencyHolder.Text, NumberStyles.Currency, NumberFormatInfo.InvariantInfo, currency)
person Tim Schmelter    schedule 07.01.2016
comment
+1 Это должен быть принятый ответ, и, кроме того, вы правильно поняли, что в операции должен использоваться десятичный тип даты. - person Matt Wilko; 07.01.2016