Обсуждение статьи "Изучаем PrintFormat() и берем готовые к использованию примеры"

 

Опубликована статья Изучаем PrintFormat() и берем готовые к использованию примеры:

Статья будет полезна как новичкам, так и уже опытным разработчикам. В ней мы рассмотрим работу функции PrintFormat(), разберём примеры форматирования строк и напишем шаблоны для вывода различной информации в журнал терминала.

Вывод значений в лог или на экран монитора является простой и привычной операцией — до тех пор, пока не понадобится вывести нечто более сложное, чем "Hello, world". Но рано или поздно возникает ситуация, когда нужно сделать форматированный вывод значения или свойства, которые не очень часто востребованы. Конечно, можно залезть в справку по MQL5 и вспомнить то, что забыл или не знал.


Но иногда хочется, чтобы где-то был готовый сборник рецептов по выводу всевозможной информации, предоставляемой терминалом MetaTrader 5. В этой cтатье мы постараемся разобрать тонкости вызова функции PrintFormat и написать готовые шаблоны, которые можно просто вставить в свой код.

Автор: Artyom Trishkin

 

Спасибо. Очень познавательно.  Но не с первого прочтения…)))

Читать справку, когда пишешь код, как-то муторно и жалко времени. Потому и, мало что понятно… Надеюсь по этой статье смогу получше разобраться в тонкостях PrintFormat() и соответственно StringFormat()

 
Не освещён, наверное, единственный в справке неочевидный момент - в каких случаях может оказаться реально полезным указание спецификатора размеров данных (h | l | ll | I32 | I64), если и без него всё работает.
 
JRandomTrader #:
Не освещён, наверное, единственный в справке неочевидный момент - в каких случаях может оказаться реально полезным указание спецификатора размеров данных (h | l | ll | I32 | I64), если и без него всё работает.

Посмотрите этот пример

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long x = (long)0xFFFFFFFF * 1000;

   Print("\nDEC: ",  typename(x)," x=",x,"\n---------");
   Print("%hu: ",  StringFormat("%hu",x));
   Print("%u: ",   StringFormat("%u",x));
   Print("%I64u: ",StringFormat("%I64u",x));
   Print("%llu: ", StringFormat("%llu",x));
   Print("\nHEX: ",  typename(x)," x=",StringFormat("%llx",x),"\n---------");
   Print("%hx: ",  StringFormat("%hx",x));
   Print("%x: ",   StringFormat("%x",x));
   Print("%I64x: ",StringFormat("%I64x",x));
   Print("%llx: ", StringFormat("%llx",x));

  }

Результат

2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  DEC: long x=4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hu: 64536
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %u: 4294966296
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64u: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llu: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  HEX: long x=3e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hx: fc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %x: fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64x: 3e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llx: 3e7fffffc18
 
JRandomTrader #:
Не освещён, наверное, единственный в справке неочевидный момент - в каких случаях может оказаться реально полезным указание спецификатора размеров данных (h | l | ll | I32 | I64), если и без него всё работает.

Работает конечно. Но вот я буквально пару часов назад обдумывал тот же вопрос, и мелькнула мысль: если мы передаём только double-значения в функцию, а уже внутри, исходя из неких критериев, понимаем, что эти double-данные должны быть long-данными. Вот тут-то мы и укажем их размер. Мысли вслух. Не проверял.

 

И как я жил все эти годы без принтформат... Наверно и дальше поживу...

 
Dmitry Fedoseev #:

И как я жил все эти годы без принтформат... Наверно и дальше поживу...

Скорее всего

 

Артём, я не понял откуда это

   uint w=(header_width==0 ? header.Length()+1 : header_width);

Вроде библиотеку никакую не подключал. Или я совсем ослеп?

 
Alexey Viktorov #:

Артём, я не понял откуда это

Вроде библиотеку никакую не подключал. Или я совсем ослеп?

Это теперь стандартный функционал к строковым переменным, к массивам.

 
Artyom Trishkin #:

Это теперь стандартный функционал к строковым переменным, к массивам.

Спасибо. Но в документации об этом вообще ничего. Что за число возвращает. Это дубликат функции StringLen()?

 
Alexey Viktorov #:

Спасибо. Но в документации об этом вообще ничего. Что за число возвращает. Это дубликат функции StringLen()?

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