Изменение регистра символов и обрезка пробелов

При работе с текстами часто возникает необходимость в некоторых стандартных операциях: привести все символы к верхнему или нижнему регистру, а также убрать лишние пустые символы (например, пробелы) в начале или конце строки. Для этих целей MQL5 API предоставляет 4 соответствующие функции. Все они модифицируют строку по месту, то есть непосредственно в имеющемся буфере (если он уже распределен).

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

Тестовый скрипт для всех функций приведен после их описаний.

bool StringToLower(string &variable)

bool StringToUpper(string &variable)

Функции преобразуют все символы указанной строки в соответствующий регистр: StringToLower — в строчные (маленькие) буквы, а StringToUpper — в прописные (большие). В том числе поддерживаются национальные языки, доступные на уровне системы Windows.

В случае успеха возвращается true, в случае ошибки — false.

int StringTrimLeft(string &variable)

int StringTrimRight(string &variable)

Функция удаляет символы перевода каретки ('\r'), перехода на новую строку ('\n'), пробелы (' '), табуляции ('\t') и некоторые другие неотображаемые символы в начале (для StringTrimLeft) или конце (для StringTrimRight) строки. Если внутри строки (между отображаемыми символами) есть еще пустые знакоместа, они сохранятся.

Функция возвращает количество удаленных символов.

В файле StringModify.mq5 демонстрируется работа вышеперечисленных функций.

void OnStart()
{
   string text = "  \tAbCdE F1  ";
               // ↑        ↑  ↑
               // |        |  └2 пробела
               // |        └пробел
               // └2 пробела и табуляция
   PRT(StringToLower(text));   // 'true'
   PRT(text);                  // '  \tabcde f1  '
   PRT(StringToUpper(text));   // 'true'
   PRT(text);                  // '  \tABCDE F1  '
   PRT(StringTrimLeft(text));  // '3'
   PRT(text);                  // 'ABCDE F1  '
   PRT(StringTrimRight(text)); // '2'
   PRT(text);                  // 'ABCDE F1'
   PRT(StringTrimRight(text)); // '0'  (больше нечего удалять)
   PRT(text);                  // 'ABCDE F1'
                               //       ↑
                               //       └пробел внутри остается
   
   string russian = "Русский Текст";
   PRT(StringToUpper(russian));  // 'true'
   PRT(russian);                 // 'РУССКИЙ ТЕКСТ'   
   string german = "straßenführung";
   PRT(StringToUpper(german));   // 'true'
   PRT(german);                  // 'STRAßENFÜHRUNG'
}