Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Легкая амнезия:) / 19 сообщений из 19, страница 1 из 1
11.05.2004, 10:36
    #32512686
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Случилось страшное - видимо я теряю память. вопрос вот в чем: как узнать является ли символьная строка числом? Никак не могу вспомнить подходящую функцию. Неужели через isdigit делать? Подскажите кто знает.
...
Рейтинг: 0 / 0
11.05.2004, 10:51
    #32512710
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
В общем случае задача достаточно нетривиальная. Например, является ли числом следующая строка:

"000 123 456-70"

В простейшем случае, можно сделать такую проверку

Код: plaintext
1.
2.
3.
4.
IF AllTrim(m.MyVar) == TRANSFORM(VAL(m.MyVar))
* переменная m.MyVar содержит число
ELSE
* переменная m.MyVar - не есть число в стандартном написании
ENDIF
Такая проверка не учитывает возможные ведущие и концевые нули (концевые в дробной части), нестандартный символ разделитель целой и дробной части, возможную разрядку троек цифр.

Кроме того, точность расчета FoxPro ограничивается 14 значащими цифрами. Т.е. если речь идет о числах, содержащих более 14 цифр, то такая проверка может не сработать.
...
Рейтинг: 0 / 0
11.05.2004, 10:54
    #32512715
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Да, можно еще проверить так:

Код: plaintext
1.
2.
IF TYPE("EVALUATE(m.MyVar)")="N"
* Переменная m.MyVar - это число в стандартном написании
ENDIF
...
Рейтинг: 0 / 0
11.05.2004, 10:55
    #32512719
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Я немного неточно выразился, когда я писал "число", имелось ввиду число в месяце, т.е. целое число в диапозоне 1-31
...
Рейтинг: 0 / 0
11.05.2004, 11:11
    #32512759
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
BETWEEN('aa123', '1', '31') - .F.
BETWEEN('23', '1', '31') - .T.
BETWEEN('32', '1', '31') - .F.
...
Рейтинг: 0 / 0
11.05.2004, 11:16
    #32512769
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Все гениальное просто. Спасибо
...
Рейтинг: 0 / 0
11.05.2004, 11:26
    #32512794
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Да заодно вопрос вдогонку. Не раз замечал что кавычки в фоксе вещь важная, так вот чем по сути в данном случае отличаются эти команды
BETWEEN('aa123', '1', '31')
BETWEEN('aa123', 1, 31)
...
Рейтинг: 0 / 0
11.05.2004, 11:41
    #32512827
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Типами данных
...
Рейтинг: 0 / 0
11.05.2004, 11:41
    #32512830
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Вот и баги проявились:
BETWEEN( '1f' ,'1' , '31') - .T.
Это не есть хорошо. Есть предложения?
...
Рейтинг: 0 / 0
11.05.2004, 11:51
    #32512852
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Это число вводится с клавиатуры? Тогда задай для TextBox.InputMask="99" в этом случае просто в принципе не смогут ничего ввести кроме цифр и знака "-".

Ну, а в самом общем случае:

Код: plaintext
1.
2.
IF TYPE("EVALUATE(m.MyVar)")="N" AND BETWEEN(EVALUATE(m.MyVar), 1 , 31 )
* То, что нужно
ENDIF
...
Рейтинг: 0 / 0
11.05.2004, 11:52
    #32512856
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
В связи с чем все это делаешь? Если интерфейсное решение, то пользуй маски ввода. Или это принципиальный вопрос?
...
Рейтинг: 0 / 0
11.05.2004, 11:59
    #32512869
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Во-первых BETWEEN('5', '1', '31')-.F. - это я вообще не понял, как такое может быть или у меня фокс глючит?
По поводу ввода: есть текстбокс куда вводятся числа в формате дд;дд... или дд-дд;дд-дд Как тут поставить маску ума не приложу, подскажите буду рад
...
Рейтинг: 0 / 0
11.05.2004, 12:07
    #32512881
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
еще одна неприятность BETWEEN('03', '1', '31') - F Похоже и это вручную надо прописывать
...
Рейтинг: 0 / 0
11.05.2004, 12:20
    #32512910
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Все заработало, спасибо Владимиру. Твой вариант и 05 нормально воспринимает, одним словом все ок.
Остался только один вопрос, просто так из интереса, почему
BETWEEN('5', '1', '31')-.F.
BETWEEN('2', '1', '31')-.T.
...
Рейтинг: 0 / 0
11.05.2004, 12:22
    #32512916
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
ВладимирМ указал же как обработать

Код: plaintext
1.
2.
3.
IF TYPE("EVALUATE(m.MyVar)")="N" AND BETWEEN(EVALUATE(m.MyVar), 1 , 31 )
* То, что нужно
ENDIF
...
Рейтинг: 0 / 0
11.05.2004, 12:27
    #32512921
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
авторОстался только один вопрос, просто так из интереса, почему
BETWEEN('5', '1', '31')-.F.
BETWEEN('2', '1', '31')-.T.

Это из-за типов данных, сравнение строк так работает.
...
Рейтинг: 0 / 0
11.05.2004, 12:32
    #32512927
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
Ну это же так просто!

Строки сравниваются в алфавитном порядке.
Цифры в строке - это те же символы. И их алфавитный порядок такой: 0123456789.

Таким образом, строки располагаются в следующем порядке:

'1'
'10'
'105'
'11'
'2'
'25'
'2f'
'3'
'a'
'b'

И '20' > '2', но < '3'.
...
Рейтинг: 0 / 0
11.05.2004, 12:35
    #32512934
lesha_spb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
всем спасибо. Думаю на этом тема закрыта
...
Рейтинг: 0 / 0
11.05.2004, 12:42
    #32512946
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Легкая амнезия:)
По поводу маски ввода.

В такой постановке, конечно не получится. Но можно сделать проверку допустимых значений в событии KeyPress, примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LPARAMETERS nKeyCode, nShiftAltCtrl
DO CASE
CASE nKeyCode< 32 
* Управляющие клавиши (стрелки, табуляторы и т.п.) - не проверяем
* Ввод допустим
CASE IsDigit(CHR(nKeyCode))
* Проверка ввода цифр
CASE InList(CHR(nKeyCode),";","-")
* Прочие символы, кроме цифр, которые допустимы в маске
OTHERWISE
* Запрет на ввод любых других символов, коды которых не учтены 
* в обработанных CASE
	NODEFAULT
ENDCASE

Как сравниваются символьные данные:

?"5"<"31"

Вернет .F., поскольку сравнение идет слева-направо по одному символу , т.е. сначала сравниваются первые символы обеих строк и естесственно 5 больше 3. После чего, последующие символы уже просто не сравниваются.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Легкая амнезия:) / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]