Главная страница
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.53 MB
Время: 0.058 c
3-1089185041
Sergey Vorobyev
2004-07-07 11:24
2004.08.01
Не открывается локальная БД Interbase из сервиса, почему?


14-1089968001
DimKa
2004-07-16 12:53
2004.08.01
За что Вам нравится данных сайт?


14-1089979029
pavel_pavel
2004-07-16 15:57
2004.08.01
Билли


1-1089931646
Ardagast
2004-07-16 02:47
2004.08.01
function some(some: array of array of integer): integer;


3-1089169402
Jedu
2004-07-07 07:03
2004.08.01
DBGridEh - поля в записи?