Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2009, 15:29   #1
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию Определить содержимое строки (date, time, datetime)

В списке TStrings хранятся строковые представления data, time, datatime. Визуально выглядит так:

Код:
13:00
25:10.2008
25:10.2008 13:00
Нужно определить формат строки в списке т.е. в строке указано: только время, только дата, дата и время. В последующем в зависимости от формата происходит сравнения либо с текущей датой, либо временем, либо датой и временем. Какие есть варианты реализации, кроме использования RegExp.
NieL вне форума Ответить с цитированием
Старый 26.03.2009, 15:37   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
if Length(mystr[i])<6 then
ShowMessage('Только время') else
if Length(mystr[i])<11 then
ShowMessage('Только дата') else
ShowMessage('Дата и время');
mihali4 вне форума Ответить с цитированием
Старый 26.03.2009, 15:45   #3
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Код:
if Length(mystr[i])<6 then
ShowMessage('Только время') else
if Length(mystr[i])<11 then
ShowMessage('Только дата') else
ShowMessage('Дата и время');
Может есть какие другие способы, т.к. не совсем оптимально на мой взгляд использовать такой алгоритм.
NieL вне форума Ответить с цитированием
Старый 26.03.2009, 15:57   #4
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Можно "в лоб", например, дату проверять :
Код:
  function ValidDate(const S: String): Boolean;
  begin
  Result := True;
  try StrToDate(S);
  except on EConvertError do Result := False;end;
  end;
Только при запуске в среде Delphi и неверном значении будет ошибка т.к. компилятор возьмет на себя исключительную ситуацию ...

Использовать можно так :
Код:
procedure TForm1.Button1Click(Sender: TObject);
  function ValidDate(const S: String): Boolean;
  begin
  Result := True;
  try StrToDate(S);
  except on EConvertError do Result := False;end;
  end;
begin
  if ValidDate(Edit1.Text) then ShowMessage('Это дата') else ShowMessage('Это не дата');
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 26.03.2009, 16:09   #5
Антон Ю.Б.
Форумчанин
 
Регистрация: 03.01.2009
Сообщений: 116
По умолчанию

С обработкой неполного формата времени вот так получилось

Код:
function GetDateTimeType(s:string):Integer;
  var DT:TDateTime;
      T:TTime;
      D:TDate;
      ts:String;
begin
 result:=-1;
 try
   D:=StrToDate(s);
   if s=DateToStr(D) then
     begin
       Result:=0;
       Exit;
     end;
 except
 end;

 try
 T:=StrToTime(s);
 if (Pos(s,TimeToStr(T))=1)
     and ((Length(TimeToStr(T))=Length(s))or(TimeToStr(T)[Length(s)+1]=':')) then
    begin
      Result:=1;
      Exit;
    end;
 except
 end;

 try
   DT:=StrToDateTime(s);
   if (Pos(s,DateTimeToStr(DT))=1)
       and ((Length(DateTimeToStr(DT))=Length(s))or(DateTimeToStr(DT)[Length(s)+1]=':')) then
     begin
       Result:=2;
       Exit;
     end;
 except
 end;


  s:='25.10.2008';
  ShowMessage(IntTostr(GetDateTimeType(s)));
  s:='13:00';
  ShowMessage(IntTostr(GetDateTimeType(s)));
  s:='25.10.2008 13:00';
  ShowMessage(IntTostr(GetDateTimeType(s)));

Последний раз редактировалось Stilet; 26.03.2009 в 16:14.
Антон Ю.Б. вне форума Ответить с цитированием
Старый 26.03.2009, 18:48   #6
NieL
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 116
По умолчанию

Антон Ю.Б., Kotofff Спасибо, но слишком сложно...
Покапался в unit'aх для работы с датой и временем ... и накатал, вроде, как наиболее удачный вариант реализации. Вот код:

Код:
   procedure GetDateTimeFmt(s: string);
   var
     dt: TDateTime;
   begin
     if DateSeparator <> '.' then
       s := StringReplace(s, '.', DateSeparator, [rfReplaceAll]);
     dt := StrToDateTime(s);
     if TimeOf(dt) > 0 then
       if DateOf(dt) > 0 then
         ShowMessage('Дата и время')
       else
         ShowMessage('Только время')
     else
       ShowMessage('Только дата');
   end;
Код:
//s2 := '13:00';
  s2 := '25.10.2008';
  //s2 := '25.10.2008 13:00';

  GetDateTimeFmt(s2);

Последний раз редактировалось NieL; 26.03.2009 в 18:52.
NieL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить количество вхождений строки S1 в строку S2 Berckyt Microsoft Office Word 5 16.03.2009 00:27
Определить максимальный по модулю элемент каждой строки. (Kate) Помощь студентам 2 29.11.2008 21:05
Определить содержимое файла f после выполнения операторов Corwin88 Помощь студентам 11 02.06.2008 00:39
Номер строки и ее содержимое... Dr_oN Помощь студентам 2 01.06.2008 21:05
Определить номер строки с наибольшей характеристикой. jenja Общие вопросы Delphi 2 26.03.2008 21:11