Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Вниз

Проверка на соответствие типу   Найти похожие ветки 

 
anri   (2003-08-06 12:03) [0]

Подскажите, как проверить, является ли значение, введенное, скажем, в TEDIT, целочисленным или вещественным? И вообще, принадлежит ли к какому-то типу?
Думал, что есть какая-нибудь функция проверки вроде isnumeric, но ничего не нашел...


 
clickmaker   (2003-08-06 12:08) [1]

Есть апишная функция IsCharAlpha.
Насчет проверки, целое или вещественное можно так
try
V := StrToInt(Edit1.Text); // для вещественного StrToFloat
Result := true; // число
except
Result := false; // строка
end;

Для вещественного можно еще проверить, чтобы все символы в строке были цифрами и DecimalSeparator встречался только один раз


 
Игорь Шевченко   (2003-08-06 12:10) [2]

Погляди в http://delphibase.endimus.com/ - может, там что-то есть готовое.

Или так:

try
MyInt := StrToInt(Edit1.Text),
except
...не число...
end;
...
try
MyFloat := StrToFloat(Edit1.Text)
except
... не вещественное число ..
end;


 
PVOzerski   (2003-08-06 12:13) [3]

type
tNumeric=(nNoNum,nInt,nReal);
function isnumeric(s:string):tNumeric;
var
code:integer;
n:int64;
i:longint;
x:extended;
begin
for i:=1 to length(s)do
if s[i]=DecimalSeparator then
s[i]:=".";
Result:=nNoNum;
val(s,n,code);
if code=0 then
Result:=nInt
else
begin
( s,x,code) type
tNumeric=(nNoNum,nInt,nReal);
function isnumeric(s:string):tNumeric;
var
code:integer;
n:int64;
i:longint;
x:extended;
begin
for i:=1 to length(s)do
if s[i]=DecimalSeparator then
s[i]:=".";
Result:=nNoNum;
val(s,n,code);
if code=0 then
Result:=nInt
else
begin
val(s,x,code);
if code=0 then
Result:=nReal;
end;
end;


 
Babay   (2003-08-06 12:55) [4]

А может сразу недавать вводить неправильное значение? Например в обработчике KeyPress. Например так:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
inherited KeyPress(key);
case key of
"0".."9",#8,#13:;
",",".": If (Text<>"") and (Text[Length(text)] in ["0".."9"]) then
Key:=DecimalSeparator
else Key:=#0;
if pos(DecimalSeparator,text)<>0 then key:=#0;
if SelLength<>0 then begin
SelLength:=0;
SelStart:=Length(text);
end;
end;
"-": Begin
Key:=#0;
if Text[1]="-" then Text:=Copy(text,2,Length(text)-1)
else Text:="-"+Text;
SelStart:=Length(text);
end;
( заточено под мои задачи) А может сразу недавать вводить неправильное значение? Например в обработчике KeyPress. Например так:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
inherited KeyPress(key);
case key of
"0".."9",#8,#13:;
",",".": If (Text<>"") and (Text[Length(text)] in ["0".."9"]) then
Key:=DecimalSeparator
else Key:=#0;
if pos(DecimalSeparator,text)<>0 then key:=#0;
if SelLength<>0 then begin
SelLength:=0;
SelStart:=Length(text);
end;
end;
"-": Begin
Key:=#0;
if Text[1]="-" then Text:=Copy(text,2,Length(text)-1)
else Text:="-"+Text;
SelStart:=Length(text);
end;
else key:=#0;
end;

end;

это я из своего компонета вырезал, немного подправил у меня там был еще ряд условий (заточено под мои задачи) их и вырезал. Но вроде все верно...
Главное чтоб смысл был ясен


 
Anatoly Podgoretsky   (2003-08-06 14:20) [5]

Babay © (06.08.03 12:55)
Это хорошо, но только не рабочее, точнее рабочее в ограниченном количестве случаев.


 
Семен Сорокин   (2003-08-06 14:31) [6]

есть готовые ф-ии в sysutils:
TryStrTo... (Int, Float, Boolean, DateTime и т.д.)
хотя точно не уверен насчет D5


 
icWasya   (2003-08-06 15:17) [7]

можно пользоваться функцией VAL

Var
S:String
F:Integer;
Code:Integer;

S:=Edit1.Text;

( S, F, Code)
можно пользоваться функцией VAL

Var
S:String
F:Integer;
Code:Integer;

S:=Edit1.Text;

Val(S, F, Code);
if (Code=0) then ShowMessage("Целая величина")
else
ShowMessage("не Целая величина - ошибка в символе "+S[Code])
;



 
PVOzerski   (2003-08-06 15:42) [8]

2icWasya ©:
о том-то я речь и вел (PVOzerski © (06.08.03 12:13)).


 
NDeu   (2003-08-06 16:01) [9]

2icWasya © Warning !!!
Val не принимает Decimal Separator.
Нужно заранее заменит его на тчк.


 
Babay   (2003-08-07 08:01) [10]

Прошу прощения. Код действительно не рабочий. Говорю же из компонета резал а проверить некогда было. Вот рабочий вариант, тока что проверил.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
"0".."9",#8,#13:;
",",".": begin
If (Text<>"") and
(TEdit(Sender).text[Length(TEdit(Sender).text)] in ["0".."9"]) then
Key:=DecimalSeparator
else Key:=#0;
if pos(DecimalSeparator,TEdit(Sender).text)<>0 then key:=#0;
if TEdit(Sender).SelLength<>0 then begin
TEdit(Sender).SelLength:=0;
TEdit(Sender).SelStart:=Length(TEdit(Sender).text);
end;
end;
"-": Begin
if TEdit(Sender).Text="" then exit;
Key:=#0;
if TEdit(Sender).Text[1]="-" then
TEdit(Sender).Text:=Copy(TEdit(Sender).text,2,Length(TEdit(Sender).text)-1)
else TEdit(Sender).Text:="-"+TEdit(Sender).Text;
( Sender) Прошу прощения. Код действительно не рабочий. Говорю же из компонета резал а проверить некогда было. Вот рабочий вариант, тока что проверил.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
"0".."9",#8,#13:;
",",".": begin
If (Text<>"") and
(TEdit(Sender).text[Length(TEdit(Sender).text)] in ["0".."9"]) then
Key:=DecimalSeparator
else Key:=#0;
if pos(DecimalSeparator,TEdit(Sender).text)<>0 then key:=#0;
if TEdit(Sender).SelLength<>0 then begin
TEdit(Sender).SelLength:=0;
TEdit(Sender).SelStart:=Length(TEdit(Sender).text);
end;
end;
"-": Begin
if TEdit(Sender).Text="" then exit;
Key:=#0;
if TEdit(Sender).Text[1]="-" then
TEdit(Sender).Text:=Copy(TEdit(Sender).text,2,Length(TEdit(Sender).text)-1)
else TEdit(Sender).Text:="-"+TEdit(Sender).Text;
TEdit(Sender).SelStart:=Length(TEdit(Sender).text);
end;
else key:=#0;
end;

end;

это для ввода вещественных чисел отрицательных и положительных. Ежели нужны только положительные исключи проверку на минус. Если только целые то соответственно на точку. Вообщем разберись и все будет ок.


 
Babay   (2003-08-07 08:20) [11]

Могу предложить еще функции, когдато писал для себя чтоб без Try обходится (условие такое было). Работают довольно быстро хоть и перебором.

function IsStrInteger(s:String):Boolean;
// Проверяет что строка содержит число типа integer
Var i:Integer;
begin
Result:=True;i:=1;
if s="" then Result:=False;
While (i<=Length(s)) and Result do begin
case s[i] of
"0".."9","-":begin
if (s[i]="-") and (i<>1) then Result:=False;
end;
else Result:=false;
end;// case
inc(i)
end;
end;

function IsStrFloat(s:String):Boolean;
// Проверяет что строка содержит число типа float
Var sepFlag:Boolean;
i:Integer;
begin
Result:=True;i:=1;SepFlag:=false;
if s="" then Result:=False;
While (i<=Length(s)) and Result do begin
case s[i] of
"0".."9","-":begin
if (s[i]="-") and (i<>1) then Result:=False;
end;
",",".":begin
if s[i]=DecimalSeparator then begin
If not SepFlag then SepFlag:=true
else Result:=false;
if not (s[i-1] in ["0".."9"]) or
not (s[i+1] in ["0".."9"]) then Result:=False;

end else Result:=False;
end;
else Result:=false;
end;// case
inc(i)
end;// while
end;

function IsStrIntegerPlus(s:String):Boolean;
// Проверяет что строка содержит число типа integer и оно положительное
begin
Result:=IsStrInteger(s);
if Result then
( s:String) Могу предложить еще функции, когдато писал для себя чтоб без Try обходится (условие такое было). Работают довольно быстро хоть и перебором.

function IsStrInteger(s:String):Boolean;
// Проверяет что строка содержит число типа integer
Var i:Integer;
begin
Result:=True;i:=1;
if s="" then Result:=False;
While (i<=Length(s)) and Result do begin
case s[i] of
"0".."9","-":begin
if (s[i]="-") and (i<>1) then Result:=False;
end;
else Result:=false;
end;// case
inc(i)
end;
end;

function IsStrFloat(s:String):Boolean;
// Проверяет что строка содержит число типа float
Var sepFlag:Boolean;
i:Integer;
begin
Result:=True;i:=1;SepFlag:=false;
if s="" then Result:=False;
While (i<=Length(s)) and Result do begin
case s[i] of
"0".."9","-":begin
if (s[i]="-") and (i<>1) then Result:=False;
end;
",",".":begin
if s[i]=DecimalSeparator then begin
If not SepFlag then SepFlag:=true
else Result:=false;
if not (s[i-1] in ["0".."9"]) or
not (s[i+1] in ["0".."9"]) then Result:=False;

end else Result:=False;
end;
else Result:=false;
end;// case
inc(i)
end;// while
end;

function IsStrIntegerPlus(s:String):Boolean;
// Проверяет что строка содержит число типа integer и оно положительное
begin
Result:=IsStrInteger(s);
if Result then
if s[1]="-" then Result:=false;
end;
function IsStrFloatPlus(s:String):Boolean;
// Проверяет что строка содержит число типа float и оно положительное
begin
Result:=IsStrFloat(s);
if Result then
if s[1]="-" then Result:=false;
end;



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

Форум: "Основная";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
1-68257
kull
2003-08-06 10:04
2003.08.21
Работа с интерфейсами...


3-68146
Rav
2003-07-29 21:55
2003.08.21
Какую базу данных выбрать?


14-68549
VEG
2003-08-04 20:16
2003.08.21
Оффтопик типа


14-68468
wnew
2003-08-06 14:00
2003.08.21
Посмотрите фотографию.


1-68400
_Nobody__
2003-08-07 11:53
2003.08.21
Использование TStrings





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский