Перейти к основному содержимому

Текст

Для конкатенации с обеих сторон нужен Text​

+ соединяет два Text. "Count: " + 5 — не "Count: 5". Это запасной результат для смешанных типов, Integer 0. Сначала превратите числа, Bool и дескрипторы в Text через StringFormat.

StringFormat(format, value0, value1)​

  • Заменяет каждое {0} на value0 и каждое {1} на value1. Любое из значений может быть любого типа. {2} и спецификаторов формата вроде {0:N2} нет.
  • Функция всегда принимает три аргумента. Для неиспользуемого значения передавайте "": StringFormat("{0} items", n, "").
  • Для более чем двух значений вкладывайте вызовы или соединяйте результаты (см. пример ниже).
  • Real всегда показывается с шестью знаками после запятой (0.500000). Чтобы получить целое число, сначала округлите его до Integer, а для вывода с фиксированной точкой масштабируйте (MathRound(r * 100)).
  • {0} заменяется раньше {1}, поэтому если текст value0 сам содержит {1}, он тоже будет заменён.
w = WindowGetActive();
s = StringFormat(StringFormat("{0} x {1} at ", WindowGetWidth(w), WindowGetHeight(w)) + "({0}, {1})",
WindowGetX(w), WindowGetY(w));
UtilityPrint(s); // например, 1280 x 720 at (100, 80)

Измерение, поиск, извлечение​

  • StringGetLength считает кодовые единицы UTF-16, а не символы. Эмодзи вне Основной многоязычной плоскости считается за 2.
  • StringGetIndexOf(text, search) даёт индекс, начиная с 0, или -1, если search не найден. Функция чувствительна к регистру, а «последнего вхождения» нет (переберите в цикле).
  • StringGetSubstring(text, start, length): start отсчитывается от 0. length, выходящий за конец, обрезается, а start на конце или за ним даёт "". Отрицательный start или length — ошибка, которая останавливает действие.
  • Синтаксиса индексации (s[0]) нет. Для одного символа используйте StringGetSubstring(s, i, 1).
  • StringContains, StringStartsWith, StringEndsWith и StringReplace работают точно и с учётом регистра. Для проверки без учёта регистра сначала переведите обе стороны в нижний регистр.
  • StringToUpper/StringToLower следуют правилам регистра языкового стандарта пользователя, поэтому турецкие i с точкой и без точки обрабатываются правильно.
  • StringTrim удаляет пробельные символы с обоих концов, включая \r, оставшийся от окончаний строк Windows \r\n.
  • StringReplace и StringSplit останавливают действие, если искомый текст или разделитель пуст.

Разбиение — это кэш, который читается по индексу​

Значение не может хранить список, поэтому StringSplit(text, delimiter) сохраняет части в контексте выполняющегося скрипта и возвращает их количество. Каждую часть читайте через StringGetSplitPartAt(i); индекс вне диапазона даёт "". Следующий StringSplit в том же скрипте заменяет этот кэш, поэтому копируйте часть в переменную, прежде чем разбивать что-то ещё. Любая встроенная функция …EnumerateAll, …FindAll… или …GetAll… в паре со своей функцией чтения …EnumeratedAt работает так же.

Сравнение текста​

== сравнивает точно и с учётом регистра. </> сравнивают порядково по кодовым единицам UTF-16, а это не словарный порядок: каждая прописная буква ASCII идёт раньше каждой строчной, а буквы с диакритикой — после z. Не показывайте такой порядок пользователю как алфавитный.