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

 

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

Вариант 1:

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

//--- input parameters
input string CloseTime        = "20:50";  // Время закрытия позиции

Плюсы:

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

входной параметр ЧЧ:ММ

Минусы:

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

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


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

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

...

 
o_o:

Минусы:

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


Да, точно. Спасибо. Сейчас допишу.

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

void OnStart()
{
  Print(TimeToString(StringToTime("1:02"), TIME_MINUTES));

  Print(TimeToString(StringToTime2("1:02"), TIME_MINUTES));
}
 
fxsaber:

К сожалению, это только для самого "тепличного" случая, когда пользователь дисциплинирован. Здесь нет ни одной проверки на корректность ввода. О чём и была речь в первом посте: то что просто и наглядно для пользователя, в программе занимает "тону" кода.

 
Vladimir Karputov:

К сожалению, это только для самого "тепличного" случая, когда пользователь дисциплинирован. Здесь нет ни одной проверки на корректность ввода. О чём и была речь в первом посте: то что просто и наглядно для пользователя, в программе занимает "тону" кода.

Штатная (и кастомная) функция со всем справляется.

Документация по MQL5: Преобразование данных / StringToTime
Документация по MQL5: Преобразование данных / StringToTime
  • www.mql5.com
Преобразование данных / StringToTime - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

Штатная функция со всем справляется.


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

//--- input parameters
input string CloseTime        = "20:50";  // Время закрытия позиции

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

 
Vladimir Karputov:

Минусы:

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

Может участвовать косвенно в Оптимизации. Например, задаете такую строку "02:10 - 14:15, 0:15" (с 02:10 до 14:15 с шагом 15 минут) и получаете соответствующую оптимизацию.

Документация по MQL5: Работа с результатами оптимизации / ParameterSetRange
Документация по MQL5: Работа с результатами оптимизации / ParameterSetRange
  • www.mql5.com
Работа с результатами оптимизации / ParameterSetRange - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

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

Проверьте.

 
Vladimir Karputov:

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

Плюсы:

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


Минусы:

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

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


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

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

...


Первую проверку можно переиначить - ввести первичную проверку на длину текста: не более пяти символов (для варианта вида 04:09) и не менее трёх символов (для варианта вида 4:09)

//+------------------------------------------------------------------+
//| Check HH:MM To Time                                              |
//+------------------------------------------------------------------+
bool CheckHHMMToTime(const string text)
  {
   bool result=true;
//--- step 1: the number of characters must be at least 3 and not more than 5
   if(StringLen(text)<3 || StringLen(text)>5)
      return(false);
//---
   return(result);
  }
 
Кастомная может быть полезна, когда человек задает, например, так время "01:70" - понятно, что это 02:10. Штатная с таким уже не справится, а кастомная съест.
 
Vladimir Karputov:

Первую проверку можно переиначить - ввести первичную проверку на длину текста: не более пяти символов (для варианта вида 04:09) и не менее трёх символов (для варианта вида 4:09)


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

Причина обращения: