![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка значения строки: [D6]
Separator © (2002-11-11 07:51:00)Мне нужно проверичть, что записано в строке: дата, число или текст. Я делаю так:
type
TTypeStr = (tsString, tsDate, tsNumber);
function TypeStr(St: string): TTypeStr;
var
WNumber: real;
WDate: TDateTime;
begin
Result:= tsNumber;
try
WNumber:= StrToFloat(St);
except
on EConvertError do
begin
Result:= tsDate;
try
WDate:= StrToDateTime(St);
except
on EConvertError do
Result:= tsString
end
end
end
end;
Как мне сделать, чтоб в дебаг режиме в этойфункции не вылетало сообщение об ошибке. Или предложите другой метод проверки.
Separator (2002-11-14 13:49:00) [1]Во блин загнул. Было-бы конечно проще, но тут воозникает небольшая проблемка, я получаю эти данные в нормальном виде и записываю в StringGrid, а там как ивестно все храниться в текстовом формате. Просто сложилась такая ситуация, что в одном столбце могуть быть разные данные, там куча условий, вот мне иногда и надо проверять что там записано.
Skyle (2002-11-14 13:38:00) [2]А не проще ли не заморачиваться приведением типов? Ведь типы даннх придумали для того, чтобы ими пользовались? Может имеет смысл передавать значения в процедуру именно того типа, которого нужно, без приведения их к строке.
Конечно, я не знаю, может это и оправдано в программе, но ИМХО, это увеличение энтропии, которая, в свою очередь, как известно, мера хаоса...:)
Separator (2002-11-13 12:58:00) [3]Решил. Оказываетс я это очень просто.
type
TTypeStr = (tsString, tsDate, tsNumber);
function CheckString(Value: string): TTypeStr;
begin
if StrToDateTimeDef(Value, 0) = 0 then
if StrToIntDef(Value, 0) = 0 then
Result:= tsString
else
Result:= tsNumber
else
Result:= tsDate
end;
Separator (2002-11-12 06:18:00) [4]
> Skyle © (11.11.02 11:00)
Это метод работает вообще не так. У меня только одеа строковая переменная, в ней хранится в тестовом виде строка, чило или дата: "текст", "1111", "12.11.02 9:14:39"
Skyle (2002-11-11 11:47:00) [5]Это который мой чтоли? %)))
KoluChi (2002-11-11 11:40:00) [6]Имеется ввиду вариант работы с Variant :)
Skyle (2002-11-11 11:29:00) [7]
> KoluChi © (11.11.02 11:01)
> Variant все равно будет пытататься преобразовать с помощью
> системных настроек (т.е. разделителем будет считаться только
> "." или ",", а дата должна быть в определенном формате).
> Этот вариант/Variant в данном случае не очень хорош. Самое
> логичное решение - проверять по-символьно. Муторно, но что
> делать?
Это я об этом... Хотя, на самом деле, я мало что понял...%) Особенно по поводу того, какой вариант имеется ввиду...
Separator (2002-11-11 11:11:00) [8]
> Skyle © (11.11.02 11:09)
Это о чем?
Skyle (2002-11-11 11:09:00) [9]Currency and date/time formatting variables ?
KoluChi (2002-11-11 11:01:00) [10]Variant все равно будет пытататься преобразовать с помощью системных настроек (т.е. разделителем будет считаться только "." или ",", а дата должна быть в определенном формате). Этот вариант/Variant в данном случае не очень хорош. Самое логичное решение - проверять по-символьно. Муторно, но что делать?
Skyle (2002-11-11 11:00:00) [11]
procedure Check(Value : Variant);
begin
case VarType(Value) of
varString : ShowMessage("This is a String");
varDouble, varInteger : ShowMessage("This is a number");
varDate : ShowMessage("This is a Date");
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Check(10);
Check("fuck off");
Check(Now);
end;
KoluChi (2002-11-11 10:57:00) [12]вот что нашел (функция возможно не оптимизирована),
что-то наподобие можно сделать и с датой:
function GetTextReal(Str: AnsiString; var Res: Real): Boolean;
function SkipBlanks(Buf: PChar): PChar;
begin
while (Buf^ = " ") do
Inc(Buf);
Result := Buf;
end;
var
Buf: PChar;
Negative: Boolean;
Int: Real;
Dec, Pow: Real;
begin
Int := 0;
Dec := 0;
Pow := 10;
Result := true;
Negative := false;
Buf := SkipBlanks(PChar(Str));
if (Buf^ = #0) then Res := 0;
if (Buf^ = "-") then
begin
Negative := true;
Inc(Buf);
end;
Buf := SkipBlanks(PChar(Buf));
while (Buf^ in ["0".."9"]) do
begin
Int := Int * 10 + (Ord(Buf^) - Ord("0"));
Inc(Buf);
end;
Buf := SkipBlanks(PChar(Buf));
if (Buf^ in [".", ","]) then
begin
Inc(Buf);
Buf := SkipBlanks(PChar(Buf));
while (Buf^ in ["0".."9"]) do
begin
Dec := Dec + (Abs(Ord(Buf^) - Ord("0")) / Pow);
Pow := Pow * 10;
Inc(Buf);
end;
end;
Res := Int + Dec;
if (Negative) then Res := -Res;
if (Res = 0) and (Trim(Str) <> "0") Result := false;
end;
Separator (2002-11-11 10:53:00) [13]
> stone © (11.11.02 10:37
ты там что-то говорил про вариант, приведи пример пожалуйста
Smithson (2002-11-11 10:53:00) [14]Если у тебя строка, то stone прав, как ни изгаляйся, а ничего кроме твоего дерева try .. except не предложишь.
stone (2002-11-11 10:37:00) [15]Separator © (11.11.02 10:30)
Из строковой переменной, это не имеет значения
Имеет значение, строковая переменная - это строковая переменная, и никакая другая, ее можно преобразовать в другой формат, но она сама является строкой.
Separator (2002-11-11 10:30:00) [16]Из строковой переменной, это не имеет значения
stone (2002-11-11 10:29:00) [17]Separator © (11.11.02 10:26)
> stone © (11.11.02 10:23)
А пример можно, я вообще стараюсь варианты избегать, поэтому с ними еще и не работал
Без проблем, только скажи для начала откуда ты получаешь значение которое надо проверить?
Separator (2002-11-11 10:27:00) [18]
> stone © (11.11.02 10:27)
Это я не тебе писал
stone (2002-11-11 10:27:00) [19]ну уж если написать одну строку кода муторно, тогда я не знаю...
Separator (2002-11-11 10:26:00) [20]
> stone © (11.11.02 10:23)
А пример можно, я вообще стараюсь варианты избегать, поэтому с ними еще и не работал