Текущий архив: 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.051 c