Текст
Для конкатенации с обеих сторон нужен 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. Не показывайте такой порядок пользователю как алфавитный.