IsNumeric возвращает true для строк, содержащих символ D.

Сегодня утром у меня была странная ошибка в приложении 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?


person Matt Wilko    schedule 25.11.2011    source источник


Ответы (3)


Если вы проверите документы 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.

person Bob77    schedule 25.11.2011
comment
О, хорошо, тогда я предполагаю, что это было изменено/заброшено в VB.NET? - person Matt Wilko; 25.11.2011
comment
Похоже, это еще одна потеря верности, да. - person Bob77; 25.11.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», она становится числовой, поэтому вам нужно добавить проверку для этого, как я сделал в своем коде.

person George Mastros    schedule 28.11.2011
comment
IsNumeric(null & e0) вернет false, тогда зачем проверять пустую строку? - person bjan; 26.02.2013
comment
Ты прав. Однако если вы измените этот код для проверки целых чисел с помощью IsNumeric( & .0e0), он вернет значение true. - person George Mastros; 26.02.2013
comment
IsNumeric (34,20 долл. США) не работает с локалью английского языка США. - person prem; 09.10.2015

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

person UnhandledExcepSean    schedule 25.11.2011