Выбрать главу

str.sprintf("%s %.1f%%", "perfect competition", 100.0);

Данная функция поддерживает спецификаторы формата, используемые функцией библиотеки С++ sprintf(). В приведенном выше примере переменной str присваивается значение «perfect competition 100.0%» (абсолютно безупречное соревнование).

Имеется еще один способ составления строк из других строк или чисел, и он заключается в использовании функции arg():

str = QString("%1 %2 (%3s-%4s)")

.arg("реrmissive").arg("society").arg(1950).arg(1970);

В этом примере «%1» заменяется словом «permissive» (либеральное), «%2» заменяется словом «society» (общество), «%3» заменяется на «1950» и «%4» заменяется на «1970». В результате получаем «permissive society (1950s — 1970s)» (либеральное общество в 1950—70 годах). Функция arg() перегружается для обработки различных типов данных. В некоторых случаях используются дополнительные параметры для управления шириной поля, базой числа или точностью числа с плавающей точкой. В целом гораздо лучше использовать arg(), а не sprintf(), поскольку эта функция сохраняет тип, полностью поддерживает Unicode и позволяет трансляторам изменять порядок параметров «%1».

QString может преобразовывать числа в строки, используя статическую функцию QString::number():

str = QString::number(59.6);

Или это можно сделать при помощи функции setNum():

str.setNum(59.6);

Обратное преобразование строки в число осуществляется при помощи функций toInt(), toLongLong(), toDouble() и так далее. Например:

bool ok;

double d = str.toDouble(&ok);

Этим функциям передается необязательный параметр—ссылка на переменную типа bool, которая устанавливается на значение true или false в зависимости от успешности преобразования. Если преобразование завершается неудачей, эти функции возвращают 0.

Имея некоторую строку, нам часто приходится выделять какую-то ее часть. Функция mid() возвращает подстроку заданной длины (второй аргумент), начиная с указанной позиции (первый аргумент). Например, следующий программный код выводит на консоль слово «pays»[6]:

QString str = "polluter pays principle";

qDebug() << str.mid(9, 4);

Существуют также функции left() и right(), которые выполняют аналогичную работу. Обеим функциям передается количество символов n, и они возвращают первые и последние n символов строки. Например, следующий программный код выдает на консоль слова «polluter principle»:

QString str = "polluter pays principle";

qDebug() << str.left(8) << " " << str.right(9);

Если требуется определить, содержится ли в строке конкретный символ, подстрока или соответствует ли строка регулярному выражению, мы можем использовать один из вариантов функции indexOf() класса QString:

QString str = "the middle bit";

int i = str.indexOf("middle");

В результате i становится равным 4. Функция indexOf() возвращает -1 при неудачном поиске и принимает в качестве необязательных аргументов начальную позицию и флажок учета регистра.

Если мы просто хотим проверить начальные или конечные символы строки, мы можем использовать функции startsWith () и endsWith():

if (url.startsWith("http:") && url.endsWith(".png"))

Это проще и быстрее, чем:

if (url.left(5) == "http:" && url.right(4) == ".png")

Оператор сравнения строк == зависит от регистра. Если сравниваются строки, которые пользователь видит на экране, обычно правильным решением будет использование функции localeAwareCompare(), а если необходимо сделать сравнение не зависимым от регистра, мы можем использовать функции toUpper() или toLower(). Например:

if (fileName.toLower() == "readme.txt")

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

QString str= "a cloudy day";

str.replace(2, 6, "sunny");

Результатом является «sunny day» (солнечный день). Этот программный код может быть переписан с применением функций remove() и insert():

str.remove(2, 6);

str.insert(2, "sunny");

Во-первых, мы удаляем шесть символов, начиная с позиции 2, и в результате получаем строку «а_ _day» (с двумя пробелами), затем мы вставляем слово «sunny» в позицию 2.

Существуют перегруженные версии функции replace(), которые заменяют все подстроки, совпадающие со значением первого аргумента, вторым аргументом. Например, ниже показано, как можно заменить все символы «&» в строке на «&amp;»:

вернуться

6

Используемый здесь удобный синтаксис qDebug() << arg требует включения заголовочного файла <QtDebug>, в то время как синтаксис qDebug("...", arg) доступен в любом файле, который включает по крайней мере один заголовочный файл Qt.