Русский

Справочник MQL4 Общие функции PrintFormat

PrintFormat

Форматирует и печатает наборы символов и значений в журнал экспертов в соответствии с заданным форматом.

void  PrintFormat(
   string format_string,   // форматная строка
   ...                     // значения простых типов
   );

Параметры

format_string

[in]  Строка формата состоит из обычных символов и, если за строкой формата следуют аргументы, еще и спецификации формата.

...

[in]  Любые значения простых типов, разделенные запятыми. Общее количество параметров не может превышать 64, включая форматную строку.

Возвращаемое значение

Строка.

Примечание

При работе в тестере стратегий в режиме оптимизации функция PrintFormat() не выполняется.

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

Если за строкой формата следуют еще параметры, то эта строка должна содержать спецификации формата, определяющие формат вывода этих параметров. Спецификация формата всегда начинается с символа знака процента (%).

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

Спецификация формата имеет следующую форму:

          %[flags][width][.precision][{h | l | ll | I32 | I64}]type

Каждое поле форматной спецификации является либо простым символом, либо числом, обозначающим обычную форматную опцию. Простейшая спецификация формата содержит только знак процента (%) и символ, определяющий тип выводимого параметра (например %s). Если требуется в форматной строке вывести символ знак процента, то необходимо использовать форматную спецификацию %%.

flags

Флаг

Описание

Поведение по умолчанию

– (минус)

Выравнивание по левому краю в пределах заданной ширины

Выравнивание по правому краю

+ (плюс)

Вывод знака + или - для значений знаковых типов

Знак выводится только если значение отрицательное

0 (ноль)

Перед выводимом значением добавляются нули в пределах заданной ширины. Если указан флаг 0 с целочисленным форматом (i, u, x, X, o, d) и задана спецификация точности (например, %04.d), то 0 игнорируется.

Ничего не вставляется

пробел

Перед выводимым значением ставится пробел, если значение является знаковым и положительным

Пробелы не вставляются

#

Если используется совместно с форматом o, x или X, то перед выводимым значением добавляется 0, 0x или 0X соответственно.

Ничего не вставляется

 

Если используется совместно с форматом e, E, a или A, то значение всегда выводится с десятичной точкой.

Десятичная точка выводится только если есть ненулевая дробная часть.

 

Если используется совместно с форматом g или G, флаг определяет наличие десятичной точки в выводимом значении и  препятствует отсечению ведущих нулей.

Флаг # игнорируется при совместном использовании с форматами c, d, i, u, s.

Десятичная точка выводится только если есть ненулевая дробная часть. Ведущие нули отсекаются

 

width

Неотрицательное десятичное число, которое задает минимальное число выводимых символов отформатированного значения. Если количество выводимых символов меньше указанной ширины, то добавляется соответствующее количество пробелов слева или справа в зависимости от выравнивания (флаг –). При наличии флага ноль (0), перед выводимым значением добавляется соответствующее количество нулей. Если число выводимых символов больше заданной ширины, то выводимое значение никогда не усекается.

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

precision

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

Для разных форматных типов (type) спецификация точности применяется по-разному.

Типы

Описание

Поведение по умолчанию

a, A

Спецификация точности указывает количество знаков после десятичной точки

Точность по умолчанию – 6.

c, C

Не применяется

 

d, i, u, o, x, X

Указывает минимальное число выводимых цифр. Если количество цифр в соответствующем параметре меньше указанной точности, то выводимое значение дополняется слева нулями. Выводимое значение не обрезается, если количество выводимых цифр больше указанной точности

Точность по умолчанию – 1.

e, E, f

Указывает число выводимых цифр после десятичной точки. Последняя выводимая цифра округляется

Точность по умолчанию – 6. Если указана точность 0 или дробная часть отсутствует, то десятичная точка не выводится.

g, G

Указывает максимальное число значимых цифр

Выводится 6 значимых цифр.

s, S

Указывает количество выводимых символов строки. Если длина строки превышает значение точности, то строка усекается на выводе

Выводится вся строка

 

h | l | ll | I32 | I64

Спецификации размеров данных, передаваемых в качестве параметра.

Тип параметра

Используемый префикс

Совместный спецификатор типа

int

l (маленькая L)

d, i, o, x, or X

uint

l (маленькая L)

o, u, x, or X

long

ll (две маленькие L)

d, i, o, x, or X

short

h

d, i, o, x, or X

ushort

h

o, u, x, or X

int

I32

d, i, o, x, or X

uint

I32

o, u, x, or X

long

I64

d, i, o, x, or X

ulong

I64

o, u, x, or X

 

type

Спецификатор типа является единственным обязательным полем для форматированного вывода.

Символ

Тип

Выводной формат

c

int

Символ типа short (Unicode)

C

int

Символ типа char (ANSI)

d

int

Знаковое десятичное целое

i

int

Знаковое десятичное целое

o

int

Беззнаковое восьмеричное целое

u

int

Беззнаковое десятичное целое

x

int

Беззнаковое шестнадцатиричное целое с использованием "abcdef"

X

int

Беззнаковое шестнадцатиричное целое с использованием "ABCDEF"

e

double

Вещественное значение в формате [ – ]d.dddd e [sign]ddd, где d – одна десятичная цифра, dddd – одна или больше десятичных цифр, ddd – трехзначное число, определяющее размер экспоненты, sign – знак плюс или минус

E

double

Идентично формату e, за исключением того, что знак экспоненты вывоится большой буквой (E вместо e)

f

double

Вещественное значение в формате [ – ]dddd.dddd, где dddd – одна или больше десятичных цифр. Количество выводимых знаков перед десятичной точкой зависит от величины значения числа. Количество знаков после десятичной точки зависит от требуемой точности.

g

double

Вещественное значение, выводимое в формате f или e, в зависимости от того какой вывод будет компактнее.

G

double

Вещественное значение, выводимое в формате f или E, в зависимости от того какой вывод будет компактнее.

a

double

Вещественное значение в формате [−]0xh.hhhh p±dd, где h.hhhh – мантисса в виде шестнадцатиричных цифр с использованием "abcdef", dd – одна или более цифр экспоненты. Количество знаков после запятой определяется спецификацией точности

A

double

Вещественное значение в формате [−]0xh.hhhh P±dd, где h.hhhh – мантисса в виде шестнадцатиричных цифр с использованием "ABCDEF", dd – одна или более цифр экспоненты. Количество знаков после запятой определяется спецификацией точности

s

string

Вывод строки

Вместо функции PrintFormat() можно использовать функцию printf().

Пример:

void OnStart()
  {
//--- имя торгового сервера
   string server=AccountInfoString(ACCOUNT_SERVER);
//--- номер торговго счета
   int login=(int)AccountInfoInteger(ACCOUNT_LOGIN);
//--- вывод значения long
   long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
   PrintFormat("%s %d: плечо = 1:%I64d",
               server,login,leverage);
//--- валюта депозита
   string currency=AccountInfoString(ACCOUNT_CURRENCY);               
//--- вывод значения double с 2 цифрами после десятичной точки
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);
   PrintFormat("%s %d: размер собственных средств на счете = %.2f %s",
               server,login,equity,currency);
//--- вывод значения double с обязательным выводом знака +/-
   double profit=AccountInfoDouble(ACCOUNT_PROFIT);
   PrintFormat("%s %d: текущий результат по открытым ордерам = %+.2f %s",
               server,login,profit,currency);
//--- вывод значения double с переменным количеством цифр после десятичной точки
   double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   string format_string=StringFormat("%%s: значение одного пункта  = %%.%df",_Digits);
   PrintFormat(format_string,_Symbol,point_value);
//--- вывод значения int
   int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   PrintFormat("%s: текущий спред в пунктах = %d ",
               _Symbol,spread);
//--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр
   PrintFormat("DBL_MAX = %.17e",DBL_MAX);   
//--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр
   PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE);  
//--- вывод через PrintFormat() с точностью по умолчанию
   PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE);
//--- простой вывод через Print()
   Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE);
/* результат выполнения
   MetaQuotes-Demo 4236774: плечо = 1:100
   MetaQuotes-Demo 4236774: размер собственных средств на счете = 9998.49 USD
   MetaQuotes-Demo 4236774: текущий результат по открытым ордерам = -1.51 USD
   EURJPY: значение одного пункта  = 0.001
   EURJPY: текущий спред в пунктах = 15 
   DBL_MAX = 1.79769313486231570e+308
   EMPTY_VALUE = 2.14748364700000000e+009
   PrintFormat(EMPTY_VALUE) = 2.147484e+009
   Print(EMPTY_VALUE) = 2147483647
*/   
  }

Смотри также

StringFormat, DoubleToString, Вещественные типы (double, float)