This topic has been deleted. Only users with topic management privileges can see it.
-
Hi,
Consider we have a
QString
and we want to search for a character in it.What method is best for it and what does it return when that character is found or not please?
-
Hi,
What about QString::contains ?
-
or
bool ClassName::containLetter(QChar letter, QString myString)
{
foreach(QChar char, myString)
if(letter== char)
return true;
return false;
} -
@Artmetic why reinvent the wheel when the function is already available ?
-
Yes it is avaible, but everything depends of the problem. The use of your solution is probably optimalized and faster, but of course it depends 🙂
-
@tomy Taking a short look at Qt documentation you would be able to answer your question by yourself…
-
@SGaist
Good solution, but what if we want to know “the index of that QChar” if exists?@jsulm
Good thanks. How should I look for a specific method while apparently there are thousands methods on Qt documentations? For example I want the index of a specific char in a string (if that exists), what is an optimized way to look for it?PS: Of course I can use a simple for loop but when there is method already, why increase lines of code by loops!
-
@tomy
the answer would be
int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
😉
straight from the docu, 10 seconds search. Once you have some kind of routine, the docu is realy fast and good to navigate.
-
Thanks, but it does not work OK always. For example consider these:
double d = 12000000; QString s = QString::number(d); int point = s.indexOf('.'); lineEdit -> setText(QString::number(point));
The result is
1
!
Using this one too:double d = 12000000; QString s; QTextStream ss(&s); ss << d; int point = s.indexOf('.') lineEdit -> setText(QString::number(point));
The result is
1
again! -
@tomy Dude, the answer “1” is spot on accurate.
If you display the result of QString::number(12000000) you’ll get “1.2e+07” == 1.2 * 10^7 == 1.2 * 10000000 == 12000000.
Therefore the ‘.’ is the second character e.g. index ‘1’.
Try QString::number(d, ‘f’, 0). That should work as it will output 12000000 and s.indexof(‘.’) will return -1 (if that’s what you want).
-
There will not be any dot in other numbers, say, 12.21! Because we have used ‘0’ as the precision!
-
@tomy Precisely. Your example was of an integer number, albeit packed into a double (there is adequate precision for your example)
If you ask for extra precision you will get extra ‘0’s after the decimal point. I don’t know if this is what you want.
What is it you are trying to do?! If you are justing searching for characters use indexOf. Is this is something to do with figuring out how many digits are required to display a number? In which case use math functions such as floor, ceiling and log10. If you want to know about the fractional parts use X-floor(X).
The example you gave does work. Just not the way you want it too and that was not what you originally asked for.
-
Also, why not use a QDoubleSpinBox to show your numbers ?
-
@tomy How? Well, you know it is QString so take a look at its documentation. QString doesn’t have “thousands” of methods.
-
@matthew.kuiash
What I need is showing a double result. It may be a very small negative/positive number (say, -0.000000001234) or a very big positive/negative number (say, +2500000000036540). It’s range I should cover by code.
I only need the ‘number of’ digits after the decimal point. Then I will use another method to use ‘that number’ precision for the output.
@SGaist:
Very good info, thanks.
But the lineEdit there, is used to “show” the result of a calculation. (My calculator works fine but I just want to make it more precise).
QDoubleSpinBox has two buttons and works in essence like an editable cadre, while I just need “to show” the result (and also save the current result for the next expressions). -
double d = 12000000.0; QString s = QString::number(d,'f',std::numeric_limits<decltype(d)>::max_digits10); if(s.contains('.')){ int i=s.size()-1; for(;s.at(i)=='0';--i){} s=s.left(i+ (s.at(i)=='.' ? 0:1)); }
Edit:
alternative:
// needs #include <cmath> double d = 12000000.0; double junk; int precision=0; for(double tester=d;!qFuzzyIsNull(std::modf(tester,&junk));++precision,tester*=10.0){} QString s = QString::number(d,'f',precision);
-
@VRonin
Thank you.Both have flaws. But also both have high level of precision.
I think the flaws belong to the way numbers are stored in registers. And I think there is no completely (100%) accurate calculator in the world because of that.I chose the latter. Thanks for your help. I’m appreciative.
-
@tomy OK. You have plenty to go on here but I’ll just caution you that the number of digits after the decimal point can be extremely high for doubles.
-
@matthew.kuiash
I have used as high precision as possible for doubles using VRonin’s code.
I think I’m at the end. The differences between what we expect and what is shown using the code may happen for low of high precisions because of the difference of the way we and the machine calculate expressions. -
Hi @tomy. QDoubleSpinBox can be used as you mentioned . First, to hide buttons call QAbstractSpinBox::setButtonSymbols(ButtonSymbols bs) and second call QAbstractSpinBox::setReadOnly(bool r).
Have a nice day.
У меня есть строка, типа QString
, которая содержит запись вида Some text COM5 some_text, число после COM в диапазоне от 1 до 255. Как мне взять подстроку COM123?
задан 19 мар 2018 в 12:21
Воспользуйтесь классом QRegExp.
Для вашей задачи, сформируем простое регулярное выражение вида:
COMd{1,}
ответ дан 19 мар 2018 в 12:59
int comPos = s.indexOf("COM");
int comEndPos = s.indexOf(" ", comPos);
QString subStr = s.mid(comPos, comEndPos - comPos);
Только тут нет никаких проверок, нужно проверять результаты функций, а то мало ли у вас в строке не будет подстроки “COM” и т.д. и т.п.
ответ дан 19 мар 2018 в 12:45
vt-egorovvt-egorov
1,1927 серебряных знаков11 бронзовых знаков
2 / 2 / 0 Регистрация: 22.11.2015 Сообщений: 45 |
|
1 |
|
13.05.2016, 20:38. Показов 17304. Ответов 1
как определить , есть ли в нашей строке(str1) символы JFIF, если да то вывести сообщение +
0 |
44 / 44 / 12 Регистрация: 05.04.2015 Сообщений: 345 |
|
13.05.2016, 20:52 |
2 |
int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
13.05.2016, 20:52 |
2 |
Работа со строками QString в Qt5
- Необходимо #include <QString>;
- Элементы строки QString относятся к символьному типу QChar.
- Для задания строки можно использовать оператор =.
- Строки можно сравнивать с помощью ==, <=, >=, !=, >,<. Результат зависит от регистра символов.
- Доступ к элементу осуществляется с помощью [] или .at(index). Счет начинается с нуля.
- Для конкатенации строк можно использовать +, +=.
Основные функции
Функция | Описание | Пример |
append | Добавление к строке справа строки. | s=”one”; s.append(” two”); // “one two” |
clear | Очищает содержимое строки. При проверке isEmpty вернет true, isNull вернет true. | s.clear(); |
::compare | Сравнение строк. Возможность учитывать регистр. Результатом является целое число, меньшее нуля, если первая строка меньше второй, равно нулю, если строки равны, большее нуля, если первая строка больше второй. | int x = QString::compare(“aUtO”, “AuTo”,Qt::CaseInsensitive); // 0 |
size | Количество символов в строке | s=”itmath”; int n=s.size(); //5 |
contains | true, если строка содержит данную строку. Чувствительность к регистру определяется вторым параметром. | s=”Abc Def”; s.contains(“dEf”, Qt::CaseInsensitive); //true |
indexOf | Номер позиции первого вхождения строки в данную строку. Можно указать, с какой позиции искать. Возвращает -1, если строки не найдена. | s=”test line best”; s.indefOf(“est”); // 1 s.indexOf(“est”,5); //10 |
length | Количество символов в строке | s=”test”; s.length(); //4 |
split | Разбиение строки на фрагменты. На вход строка разделителей или регулярное выражение. Можно уточнить, пропускать ли пустые фрагменты. Возвращает список. Обратная операция: QStringList::join(QChar sep) | s=”a,,,,,b,c”; QStringList w=s.split(“,”, QString::SkipEmptyParts); // [“a”,”b”,”c”] |
fill | Заполнение строки заданным символом QChar ch. Если указать дополнительно второй параметр int size, равный новому размеру строки. | s=”math”; s.fill(‘e’,3); //eee |
insert | Вставка строки в заданную позицию | s=”QtStyle”; s.insert(2,”C++”); //QtC++Style |
isEmpty | Проверка на пустую строку | QString s; s.isEmpty(); //true s=””; s.isEmpty(); //true s=” “; s.isEmpty(); //false |
isNull | Проверка на инициализацию | QString s; s.isNull(); //true s=””; s.isNull(); //false s=” “; s.isNull(); //false |
prepend | Добавление строки или символа в начало данной строки | s=”def”; s.prepend(“abc”); //abcdef |
remove | Удаление фрагмента с указанной позиции заданной длины, удаление всех вхождений данного символа или строки (с учетом настроек чувствительности к регистру) | s=”example”; s.remove(1,4); //”ele” s=”abcA”; s.remove(QChar(‘a’), Qt::CaseInsensitive); //”bc” |
replace | Замена фрагмента, заданный позицией и количеством символом, на данную строку. Есть еще вариант вызова для замены всех вхождений. | s=”It math”; s.replace(3,4,”c++”); //”it c++” |
resize | Изменение длины строки | s=”c++ and qt”; s.resize(3); //”c++” |
setNum | Перевод переданного числа в строковое представление. Можно указать основание системы счисления (10 по умолчанию) | s.setNum(2015); //”2015″ |
swap | Обмен значений строк. Выполняется очень быстро | s=”abc”; w=”cde”; s.swap(w); |
toDouble | Конвертация строки в действительное число типа double. Вторым параметром можно передать ссылку на булеву переменную, в которой будет true/false в зависимости от успешности конвертации. | s=”12.34″; double d=str.toDouble(); //12.34 |
toInt | Конвертация строки в целое число в данной системе счисления (по умолчанию 10). | s=”123″; bool flag; int n=s.toInt(&flag); if (flag) { //success }; |
toLower | Перевод всех символов в нижний регистр | |
toUpper | Перевод всех символов в верхний регистр | |
trimmed | Удаление пробельных символов в начале и в конце строки (‘ ‘,’t’,’n’,’v’,’f’,’r’) | |
truncate | Удаление окончания строки с указанного символа | s=”abcdel”; s.truncate(3); //”abc” |
Дополнительные функции
Функция | Описание | Пример |
capacity | Максимальное количество символов, которое может храниться в данной строке без выделения новой памяти | s=”a”; s.append(“a”); //”aa” int c=s.capacity(); //7 |
chop | Удаление данного количество символов с конца строки. Если реальное количество символов меньше, то результатом будет пустая строка. | s=”itmath”; s.chop(4); //”it” |
count | Количество символов в строке (как и size()). Количество вхождений данной строки. | s=”aaab”; int c=s.count(“aa”); //2 |
endsWith | Возвращает true, если строка заканчивается на данную строку (или символ). Есть возможность учесть регистр. | s=”abcd”; s.endsWith(“cd”); //true |
startsWith | Возвращает true, если строка начинается на данную строку (или символ). Есть возможность учесть регистр. | s=”abcd”; s.startsWith(“ab”); //true |
left | Возвращает подстроку из n первых символов строки. | s=”abcd”; w=s.left(2); //”ab” |
right | Возвращает подстроку из n последних символов строки. | s=”abcd”; w=s.right(2); //”cd” |
mid | Возвращает строку из n символов, начиная с данной позиции. Если количество символов не указано, то возвращает все символы до конца строки. Если позиция превосходит допустимое значение, то результат – нулевая строка. | s=”abcde”; w=s.mid(2,1); //”c” |
reserve | Захват памяти не менее чем на указанное количество символов. Удобно, если заранее знаем, сколько символов может понадобится. | s.reserve(200); |
repeated | Возвращает копию строки, продублированную указанное количество раз. | s=”ab”; w=s.repeated(2); //”abab” |
section | Возвращает набор лексем строки. Указываем разделитель, номер первой лексемы, номер последней лексемы. Если номера отрицательны, то счет начинается с последней лексемы. | s=”a,bb,ccc,d”; w=s.section(‘,’,1,2); //”bb,ccc” |
simplified | Удаление в начале и в конце строки пробельных символов (t,n,v,r,’ ‘), замена серий пробельных символов внутри строки на один пробел. | s=” one n and twor”; s.simplified(); //s=”one and two”; |
lastIndexOf | Номер позиции последнего вхождения строки в данную строку. Возвращает -1, если строки не найдена. | |
toHtmlEscaped | Замена символов <,>,& и ” на html-сущности (< > и т.д.) | |
toStdString | Возвращает std::string | |
::number | Возвращает строковый эквивалент переданного числа. Можно указать, в какой системе счисления число. | s=QString::number(123); //”123″ |
все материалы
Is there any Find method in Qstring in Qt like CString find method ?
My Requirement is i have one Qstring
QString strdata = "Sunday,01:30 - 17:30";
I want to split them.
Now i want s1 = Sunday
s2 = 01:30
s3 = 17:30
Where s1,s2,s3 are QString
Thanks.
hmuelner
8,0731 gold badge28 silver badges39 bronze badges
asked Jun 7, 2011 at 7:12
QString strdata = "Sunday,01:30 - 17:30";
QStringList stringlist_0;
QStringList stringlist_1;
stringlist_0 = strdata.split( "," );
stringlist_1 = stringlist_0[1].split( " - " );
QString day = stringlist_0[0];
QString begin_time = stringlist_1[0];
QString end_time = stringlist_1[1];
answered Jun 7, 2011 at 7:22
ExaExa
4,0196 gold badges43 silver badges60 bronze badges
2
You can also use regular expression to split a string:
QStringList list = strdata.split(QRegExp("\s|-|,"), QString::SkipEmptyParts);
answered Jun 7, 2011 at 17:32
Stephen ChuStephen Chu
12.7k1 gold badge35 silver badges46 bronze badges