How to search for a specific character in a QString
-
Hi,
What about QString::contains ?
-
@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!
-
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).
-
@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 ?
-
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.
-
@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.