Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

как проверить является ли введеный текст числом?   Найти похожие ветки 

 
Draught ©   (2004-07-21 15:08) [0]

Проблемка такая, есть Edit, в который должна вводится числовая информация, число может быть как целым, так и дробным, нужно проверить является ли текст числом.

Конечно можно делать это все через case:

for i:1 to length(Edit) do
case Edit[i] of
"0":;
"1":;
"2":;
"3":;
"4":;
"5":;
"6":;
"7":;
"8":;
"9":;
",":;
else showmessage("Не число!")
end;


но меня интересует другое, возможно есть какая-нить функция, позволяющая сразу это проверить?

TryStrToInt например, только эта для целых...


 
Sandman25 ©   (2004-07-21 15:09) [1]

Val


 
Ega23 ©   (2004-07-21 15:09) [2]

Val


 
Draught ©   (2004-07-21 15:13) [3]

Val переводит любую строку в число, и возвращает код ошибки, и если код ошибки не нулевой, то значит неправильно перевелось.
Я все понял...
Усе, спасиб...


 
Sandman25 ©   (2004-07-21 15:15) [4]

Кстати, в case можно написать:

case Edit[i] of
"0".."9",",":;
else showmessage("Не число!")
end;

или вообще

if not (Edit[I] in ["0".."9",","]) then


 
Reindeer Moss Eater ©   (2004-07-21 15:16) [5]

Введенный текст := "Сто тысяч миллионов";

Val тоже не спасет.
Длинная строка девяток - это несомненно число.
Но что делать если строка девяток ну очень длинная?


 
Sandman25 ©   (2004-07-21 15:18) [6]

[5] Reindeer Moss Eater ©   (21.07.04 15:16)

Ага. А если еще римские цифры учитывать, да анализировать их правильность (например, нет числа IVI), а потом еще и "пи" с "e" добавить :)


 
Zlod3y   (2004-07-21 15:22) [7]

А я ваще блокирую ввод букв:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
"0".."9":;
#8:;
else Key:=#0;
end;
end;

Можешь поэкспериментировать с запятой ещё... я не стал с ней отрывок приводить, т.к. не вспомнил, но это возможно, я делал


 
Draught ©   (2004-07-21 15:23) [8]

if not (Edit[I] in ["0".."9",","]) then - этот вариант мне очень понравился...


 
Sandman25 ©   (2004-07-21 15:24) [9]

Только ведь разделителем может быть не только запятая...
Тогда придется писать
if not (Edit[I] in ["0".."9"]) and not (Edit[I] = DecimalSeparator) then


 
Ega23 ©   (2004-07-21 15:26) [10]

if not (Edit[I] in ["0".."9",","]) then - этот вариант мне очень понравился...

Это если DecimaleSeparator=",". А если "." - жди беды.
И, кстати, BackSpace так не нажмёшь.

procedure TFInforms.eInfCodKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ["0".."9", #8, DecimaleSeparator]) then Key:=#0;
end;


 
Zlod3y   (2004-07-21 15:28) [11]

а ещё попробуй так:
try
stroka:=StrToInt(Edit1.Text);
except
ShowMessage("Не число");
end;


 
Zlod3y   (2004-07-21 15:28) [12]

Сорри

try
stroka:=StrToFloat(Edit1.Text);
except
ShowMessage("Не число");
end;


 
Reindeer Moss Eater ©   (2004-07-21 15:29) [13]

if (Key = ",") or (Key = ".") and (Key <> DecimalSeparator) then Key := DecimalSeparator

Но не спасет от дублирования разделителей в одной строке


 
Draught ©   (2004-07-21 15:30) [14]

2Zlod3y,
я же вначале вроде ясно написал, что там число не целое может быть... StrToInt тока с целыми числами работает...

собственно остановился я на вот этом варианте
if not (Edit[I] in ["0".."9"]) and not (Edit[I] = DecimalSeparator) then


 
Zlod3y   (2004-07-21 15:32) [15]

я поправился StrToFloat
а ещё попробуй использовать TMaskEdit, говорят что сильно помогает в этом :о)


 
REA ©   (2004-07-21 15:36) [16]

TryStrToFloat еще


 
Ega23 ©   (2004-07-21 15:36) [17]

if not (Edit[I] in ["0".."9"]) and not (Edit[I] = DecimalSeparator) then

Числа могут отрицательными быть.


 
Draught ©   (2004-07-21 15:37) [18]

Zlod3y,

вот StrToFloat хороший вариант...


 
Draught ©   (2004-07-21 15:38) [19]

ну значит буду использовать MaskEdit и StrToFloat или TryStrToFloat


 
Рамиль ©   (2004-07-21 15:41) [20]

Есть еще TryStrToFloat

А самый крутой вариант - написать автомат:)

A -> A если символ 0,...,9
A -> B если символ DecimalSeparator
B -> B если символ 0,...,9


 
Sandman25 ©   (2004-07-21 15:45) [21]

C -> A если символ -,+,0,...,9
A -> A если символ 0,...,9
A -> B если символ DecimalSeparator
B -> B если символ 0,...,9


 
Рамиль ©   (2004-07-21 15:49) [22]


> [21] Sandman25 ©   (21.07.04 15:45)

Упс:) Хотя в обсуждении выше знаки не упоминались.
Еще можно добавить E


 
Sandman25 ©   (2004-07-21 15:51) [23]

Е все очень усложнит :(


 
Zlod3y   (2004-07-21 15:58) [24]

Без всяких автоматов!!!!!!!! Ненавижу эту теорию автоматов!!!!

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
"0".."9":;
#8:;
",":if Length(Edit1.Text)=0 then Key:=#0;
else Key:=#0;
end;
end;

и ещё не забудь про OnExit удалять запятую если она последний символ в Edit1


 
Draught ©   (2004-07-21 16:04) [25]

Ну вообщем-то уже вся ясна...
я думаю тему можно закрывать...

Хотя если есть желающие реализовать на это примере теорию автоматов, то я буду не против...
Так же желающие реализовать теорию не автоматов на этом же примере, тоже я буду не против...

на будущее все пригодится


 
Рамиль ©   (2004-07-21 16:08) [26]

.
> Хотя если есть желающие реализовать на это примере теорию
> автоматов, то я буду не против...

Нет уж, спасибо, я в свое время курсовую писал по разбору паскаля, больше не хочу:) Вообщем самый лучший вариант здесь, это TryStrToFloat



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
4-1087571840
alex870
2004-06-18 19:17
2004.08.01
Стили окна


14-1089885307
Artem123
2004-07-15 13:55
2004.08.01
как вставить запись в таблицу из DBGrid и ....


14-1089302982
OSokin
2004-07-08 20:09
2004.08.01
Кто из какого города?


1-1090013194
Алекс А
2004-07-17 01:26
2004.08.01
При запуске программы на испанском Виндосе, вместо русских букв,


4-1087728431
korvin
2004-06-20 14:47
2004.08.01
"Выгрузить" программу, тормознуть процесс ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский