Как найти символ в qstring

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

Мишаков Максим's user avatar

Воспользуйтесь классом 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-egorov's user avatar

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
Возвращает больше нуля если есть искомая подстрока. А вообще надо читать описание класса QString там есть много полезного



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

13.05.2016, 20:52

2

Работа со строками QString в Qt5

Qt

  • Необходимо #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-сущности (&lt; &gt и т.д.)
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's user avatar

hmuelner

8,0731 gold badge28 silver badges39 bronze badges

asked Jun 7, 2011 at 7:12

Bokambo's user avatar

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

Exa's user avatar

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 Chu's user avatar

Stephen ChuStephen Chu

12.7k1 gold badge35 silver badges46 bronze badges

Добавить комментарий