IsNumeric возвращает true для строк, содержащих символ D - PullRequest
8 голосов
/ 25 ноября 2011

У меня была странная ошибка в приложении VB6 этим утром, и все это связано с тем, что IsNumeric не работает, как я ожидал. Может кто-то пролить свет на почему? Мне это кажется ошибкой.

Этот код отображает 4.15877E+62 в окне сообщения:

Dim strMessage As String
strMessage = "0415877D57"
If IsNumeric(strMessage) Then
    MsgBox CDbl(strMessage)
Else
    MsgBox "not numeric"
End If

Я предполагаю, что двигатель времени выполнения неправильно думает, что D на самом деле является E? Я думаю, что это ошибка, хотя точно такой же код в VB.NET выводит not numeric Это известная проблема с IsNumeric?

Ответы [ 3 ]

14 голосов
/ 25 ноября 2011

Если вы проверяете документы VB6:

Примечание Значения с плавающей точкой могут быть выражены как mmmEeee или mmmDeee, где mmm - это мантисса, а eee - показатель степени (степень 10). Наибольшее положительное значение типа данных Single составляет 3.402823E + 38 или в 3,4 раза от 10 до 38-й степени; самое высокое положительное значение типа данных Double равно 1.79769313486232D + 308, или примерно в 1,8 раза от 10 до 308-й степени. Использование D для разделения мантиссы и экспоненты в числовом литерале приводит к тому, что значение обрабатывается как тип данных Double. Аналогично, использование E таким же образом рассматривает значение как тип данных Single.

11 голосов
/ 28 ноября 2011

Я давно использую свою собственную функцию IsNumber именно из-за этой ситуации. IsNumeric также может возвращать true для определенных денежных символов, например: IsNumeric ("$ 34.20").

Моя функция IsNumber выглядит следующим образом:

Public Function IsNumber(ByVal Data As String) As Boolean

  If Data = "" Then
    IsNumber = False
    Exit Function
  End If

  IsNumber = IsNumeric(Data & "e0")

End Function

Идея здесь в том, что ... если в данных уже есть e или d, добавление другого приведет к тому, что данные НЕ будут числовыми с помощью проверки IsNumeric. Вы можете легко изменить эту функцию, чтобы разрешить только целые числа, заменив «e0» на «.0e0». Хотите только натуральные числа? затем используйте это: IsNumeric ("-" & Data & ".0e0")

Единственным недостатком этого метода является то, что пустая строка обычно не является числовой, но когда вы добавляете к ней «e0», она становится числовой, поэтому вам нужно добавить проверку для этого, как я сделал в своем коде.

1 голос
/ 25 ноября 2011

Я предлагаю сделать пользовательский валидатор. Вы хотите разрешить только 0-9? А как насчет негативов? Запятые? Я никогда не заботился о реализации Microsoft, но я понимаю это.

...