Перевод string в часы и минуты - страница 2

 
Alexander Puzanov:

На входе надо зачистить от пробелов и бонусом можно добавить замену тире (2 типа) на двоеточие

datetime StringToTime2( string Str )
{
  StringReplace(Str, " ", NULL);
  StringReplace(Str, "-", ":");
  
  const int Pos = StringFind(Str, ":");
  
  return(((int)StringSubstr(Str, 0, Pos) * 60 + (int)StringSubstr(Str, Pos + 1)) * 60);
}
 
fxsaber:

datetime не подойдёт для вычисления секунды произвольного дня типа 'вчера' или 'завтра'

int fi_Day_Second(string s_Time_String) {
  StringReplace(s_Time_String, " ", NULL);
  StringReplace(s_Time_String, "-", ":");
  return(int(StringToTime("1970.01.01 " + s_Time_String)));
}

.

 
Alexander Puzanov:

datetime не подойдёт для вычисления секунды произвольного дня типа 'вчера' или 'завтра'

Не понял, что к чему не подойдет? Выше кастомная функция делает даже много больше, чем все, что в первом посте ветки сказано.
 
fxsaber:
Не понял

1. Вы бы запустили свою функцию

2. Юзер может добавить секунды

 
Alexander Puzanov:

1. Вы бы запустили свою функцию

Именно на основе запуска утверждаю изначально, что она работает.

2. Юзер может добавить секунды

Штатная функция с этим справляется без проблем. Кастомая может быть полезна только с точки зрения производительности (не проверял) и вариантов "01:87" (проверял).

 
Vladimir Karputov:

Всё штатное рассчитано для "тепличного" случая - когда пользователь сознательно вводит КОРРЕКТНЫЕ данные. Но мы то живём в реальном мире :) и знаем чего могут пользователи наворотить. Поэтому "штатное" для способа ввода вида

совсем не подходит.


"1:1" оно никакое, ни корректное, ни некорректное, так как реал может быть "01:01","01:10" и еще 2 варианта. И угадывать тут нечего, надо выдать пользователю сообщение и закрыться.

 

Лучше две переменных int, одна для часов, другая для минут, и проверку проще делать и оптимизировать можно.

 
Alexey Volchanskiy:

"1:1" оно никакое, ни корректное, ни некорректное, так как реал может быть "01:01","01:10" и еще 2 варианта. И угадывать тут нечего, надо выдать пользователю сообщение и закрыться.

Вполне корректное "1:1" час и минута без ведущих нулей , и вариант всего один "01:01"

 
Dmitry Fedoseev:

Лучше две переменных int, одна для часов, другая для минут, и проверку проще делать и оптимизировать можно.


Это будет "Вариант ввода №2". Попозжее.

 
Vladimir Karputov:

Когда встаёт задача задать во входных параметрах время в формате ЧЧ:ММ, приходится решать дилему: удобство пользователя при вводе значений или удобство программирования.

Вариант 1:

Самый известный способ ввода:

Плюсы:

* "человеческий" внешний вид значения: 


Минусы:

* довольно много проверок, для того, чтобы корректно перевести эту строку в целый тип или в datetime.

* не предназначено для оптимизации в тестере.


Самая первая проверка (которая уже ставит пользователя в ограничительные рамки) - требование придерживаться формата именно ЧЧ:ММ (например 04:09), а не Ч:ММ (например 4:09) или Ч:М (например 4:9).

И даже здесь уже распутье: а может разрешить пользователю ввод в формате Ч:ММ (например 4:09) или Ч:М (например 4:9)?

...


Спасибо за подсказки.

Самый первый шаг теперь выглядит так: отсечь пробелы справа и слева, а потом проверить текст на длину.

Шаг второй: замена "-" и "_" на корректный разделитель ":", а потом поиск разделителя ":" 

//+------------------------------------------------------------------+
//| Check HH:MM To Time                                              |
//+------------------------------------------------------------------+
bool CheckHHMMToTime(string text)
  {
   bool result=true;
//--- step 1: the number of characters must be at least 3 and not more than 5
   StringTrimRight(text);           // delete spaces to the right
   StringTrimLeft(text);            // delete spaces to the left 
   if(StringLen(text)<3 || StringLen(text)>5)
     {
      Print("Length of the text can't be less than 3 and more than 5");
      return(false);
     }
//--- step 2: search for a separator ":"
   StringReplace(text,"-",":");     // search and replacement of symbol "-"
   StringReplace(text,"_",":");     // search and replacement of symbol "_"
   int search_results=0;
   for(int i=0;i<StringLen(text);i++)
      if(text[i]==':')
         search_results++;
   if(search_results==0)
     {
      Print("Divider \":\" it isn't found");
      return(false);
     }
   if(search_results>1)
     {
      Print("More than one divider \":\" are found");
      return(false);
     }
//---
   return(result);
  }
Причина обращения: