Вопрос по IsNumeric

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Вопрос по IsNumeric

Сообщение OldRunaways » 16.04.2005 (Сб) 12:32

Почему в результате выполнения следующего кода...
Код: Выделить всё
Private Sub Form_Load()
Dim MyVar, MyCheck

MyVar = "2d8"             ' Assign a value.
MyCheck = IsNumeric(MyVar)    ' Returns False.
Debug.Print MyCheck

End Sub

... возвращается "True"? Как осуществить проверку что заданное число действительно является десятичным числом (и ни чем иным)?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.04.2005 (Сб) 12:40

Ну, если шестнадцатеричное не подходит, то можно перебирать все символы на предмет принадлежности диапазону "0"-"9".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 12:51

GSerg писал(а):Ну, если шестнадцатеричное не подходит...
В том то всё и дело, что дело ИМХО не в системах исчисления, потому как...
Код: Выделить всё
MyVar = "2c8"             ' Assign a value.
MyCheck = IsNumeric(MyVar)  '
...возвращает "False", хотя мы ему скармливаем нормальное шестнадцатиричное число (712 в нашем понимании). Тут он "орёт" - "Это не Numberic", а "2d8" упорно считает Numberic'ом. Непонятно :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 13:08

Афигеть...
Immediate писал(а):
Код: Выделить всё
?2d8
200000000
?2d2
200


Ну про E я знал, а вот этого не знал.
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 13:43

По совету GSerg решил проблемму следующим образом:
Код: Выделить всё
Private Function MyIsNumeric(ByVal testNumber As String) As Boolean
  Dim i
  For i = 1 To Len(testNumber)
    If (Asc(Mid(testNumber, i, 1)) < 48 Or Asc(Mid(testNumber, i, 1)) > 57) Then
      MyIsNumeric = False
      Exit Function
    End If
  Next
  MyIsNumeric = True
End Function

Private Sub Form_Load()
Dim MyVar, MyCheck

MyVar = "9"
MyCheck = MyIsNumeric(MyVar)
Debug.Print MyCheck

End Sub
...есть ли другие варианты? И почему всё же стандартный isNumeric работает таким странным образом?
alibek
Ты это о чём?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 13:47

О том, что 2d8 это и есть число, точно такое же, как 2e8.

З.Ы. И кстати, советую проверять не сравнением ASCII-кода, а выражением InStr(Char, "0123456789")>0, быстрее будет.
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 14:23

alibek писал(а):О том, что 2d8 это и есть число, точно такое же, как 2e8.
...только непонятно почему в случае с "2с8" (которое тоже является числом) IsNumeric утверждает что это не число, а в случае с "2d8" или "2e8" говорит, что это число.
alibek писал(а):InStr(Char, "0123456789")>0
...я же специально в чайниковский топик написал, что бы мнУ всё понятно объяснили. InStr указанную подстроку в заданной строке и в случае её нахождения возвращает код её вхождения (первый [или последний - не помню] символ в этой строке. Каким образом будет работать та конструкция которую ты написал, я, честно сказать, не представляю. Мы что, ищем подстроку "0123456789" ? Можно подробнее, если не сложно.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 14:39

Насчет 2e8 подсказка: 2e8 -> 2.0 E+8 -> 2.0 * 10^8

Код: Выделить всё
Private Function MyIsNumeric(ByVal testNumber As String) As Boolean
  Dim i As Long
  Const Digits As String = "0123456789"
  For i = 1 To Len(testNumber)
    If InStr(Mid$(testNumber, i, 1), Digits) = 0 Then Exit For
  Next i
  MyIsNumeric = (i > Len(testNumber))
End Function
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 15:04

alibek
Хм... ты сам то пробовал использовать тот код который мне написал? Не знаю как у кого, но у меня данная функция во всех случаях возвращает "False", что, по моему разумению, она и должна возвращать, ведь inStr при первой же проверке возвращает 0 (string2 is not found) он пытается в строке "1" (если я в фн-цию передаю "1") найти строку "123456789" и не находит её. ...чего недопонимаю?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 15:25

Ну да, аргументы местами перепутал.
InStr(Digits, Mid$(testNumber, i, 1))
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 15:30

alibek
:agree: Супер... всё гениальное просто :idea: И как это я сразу не догадался, что нужно в строке "123456789" посимвольно искать соответствия с проверяемой строкой :) Спасибо... и хотя туман с isNumeric для меня не рассеялся - задача решена, а главное это результат!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 15:43

Так что непонятного-то?
В VB есть две формы записи: обычная (0.0123) и научная (1.23e-2), причем функции Val() и IsNumeric() понимают обе. Но то, что вместо E можно использовать D, меня поразило.
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 15:49

alibek
Ну вот теперь полный порядок - 2d8==2e8==2.0 * 10^8 :lol: Велик и могуч наш (буржуйский) VB.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 16:13

(подозрительно) А почему два знака "="? Чую, чем-то сишным попахивает, нечистый дух какой-то... ;)
Lasciate ogni speranza, voi ch'entrate.

OldRunaways
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 10.07.2004 (Сб) 17:13

Сообщение OldRunaways » 16.04.2005 (Сб) 17:24

alibek писал(а):(подозрительно) А почему два знака "="? Чую, чем-то сишным попахивает, нечистый дух какой-то... ;)
Ну... это.. э-эээ.. просто я АСП ваяю, а где АСП там и JavaScript, а где Java там и "=="... ну, а сюда вопрос задал потому как ИМХО тут быстрее ответят чем в АСП-шной ветви ;-)

P.S. А вот чем попахивает "->"? ;-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 17:46

На кол, на кол, однозначно! :)
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.04.2005 (Сб) 18:00

2All: всем позор за незнание Бейсика :-)
"e" означает Single-константу, "d" - Double, и так было ещё в BASICA, если не раньше.

(выполнив Debug.Print TypeName(2d8), TypeName(2e8)): гм, теперь оба - Double... Странно, странно... И 2.8 - тоже Double... Облом обратной совместимости...

И всё же:
QuickBASIC Help: Data Types -> Constants писал(а):
Код: Выделить всё
Floating point      Positive or negative numbers represented in exponential
(single precision)  form. A single-precision floating-point constant is an
                    optionally signed integer or fixed-point number (the
                    mantissa) followed by the letter E and an optionally
                    signed integer (the exponent). The constant's value is
                    the mantissa multiplied by the power of ten represented
                    by the exponent. Single-precision constants have a
                    range of -3.37E+38 to 3.37E+38.

Floating point      Double-precision floating-point constants have the same
(double precision)  form as single-precision floating-point constants, but
                    use D, rather than E, to indicate the exponent. Double-
                    precision constants have a range of -1.67D+308 to
                    1.67D+308.

Single-precision constants

Single-precision numeric constants are stored with 7 digits of precision
(plus the exponent). Double-precision numbers are stored with 15 or 16
digits of precision (plus the exponent).

A single-precision constant is any numeric constant that has one of the
following properties:
  ■ Exponential form denoted by E
  ■ A trailing exclamation mark (!)
  ■ A value containing a decimal point that does not have a D in the
    exponent or a trailing number sign (#) and that has fewer than
    15 digits
  ■ A value without a decimal point that has fewer than 15 digits
    but cannot be represented as a long-integer value

Double-precision constants

A double-precision constant is any numeric constant that has one of the
following properties:
  ■ Exponential form denoted by D
  ■ A trailing number sign (#)
  ■ A decimal point, no E in the exponent or trailing exclamation
    mark (!), and more than 15 digits
Последний раз редактировалось tyomitch 16.04.2005 (Сб) 18:24, всего редактировалось 1 раз.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2005 (Сб) 18:10

2.8 всегда Double, также как 2 всегда Integer, когда может в него уместиться (а иначе Long), это то я знал. А вот про D не знал, думал что E пошло от сокращенного названия нотации.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.04.2005 (Сб) 18:26

Ок, первоисточник приведён постом выше.
Там, где 2e8 было Single, там и 2.8 было Single, так что я отчасти прав.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 33

    TopList