Форум: "Основная";
Текущий архив: 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.008 c