Showing numbers in decimal not scientific notation
-
@tomy said in Showing numbers in decimal not scientific notation:
it shows it this way
What is "it"? Where do you view the variable? In the debugger? On the standard output? In a text widget? What (if any) function do you use to output the variable?
-
@Chris-Kawa
I run it in standard mode (ctrl + R). -
@tomy said in Showing numbers in decimal not scientific notation:
I run it in standard mode (ctrl + R).
That's not what I... ugh, nevermind.
So you say you're using QTextStream. Ok, so you have a code similar to this right?QTextStream foo = ...; double bar = ...; foo << bar;
If that's the case then you can do it in a couple of ways:
Switch the stream serialization mode for floating numbers to fixed notation:QTextStream foo = ...; foo.setRealNumberNotation(QTextStream::FixedNotation); double bar = ...; foo << bar;
or pre-format the number the way you want it and pass the resulting string to the stream:
QTextStream foo = ...; double bar = ...; foo << QString::number(bar, 'f');
-
@Chris-Kawa
What is ...ugh?! I want to learn it! :)My code is like this:
QString s; QTextStream (&s) << 12 ; lineEdit -> setText(s); // It outputs 12 s.clear(); QTextStream (&s) << "ABC"; lineEdit -> setText(s); // This time it outputs ABC
-
12
is not adouble
, it's anint
.12.0
is a double and12.0f
is a float.
So anyway, like I said earlier, eitherQString s; QTextStream foo(&s); foo.setRealNumberNotation(QTextStream::FixedNotation); s << 12.0 ; //assuming you still want that double and not int lineEdit -> setText(s);
or
QString s; QTextStream (&s) << QString::number(12.0, 'f'); lineEdit -> setText(s);
but then it's kinda pointless, you can just directly do
lineEdit -> setText(QString::number(12.0, 'f'));
...ugh is the sound you can make when you don't have the energy to explain something, so you just skip it altogether ;)
-
no need to use QTextStream in that case:
lineEdit->setText(lineEdit->locale().toString(1257.147862,'f'));
'f'
prevents scientific notation, see http://doc.qt.io/qt-5/qstring.html#argument-formats -
@Chris-Kawa said in Showing numbers in decimal not scientific notation:
QString s; QTextStream (&s) << QString::number(12.0, 'f'); lineEdit -> setText(s);
I used it. It's fine for
double
s but when I calculateint
s (e.g.,2+3
) it shows5.000000
!!
We should make it show the precision only when the result is adouble
number not anint
. -
@tomy said in Showing numbers in decimal not scientific notation:
I used it. It's fine for doubles but when I calculate ints (e.g., 2+3) it shows 5.000000!!
We should make it show the precision only when the result is a double number not an int.You either calculate a double or an int, can't be both. Anyway, what you probably want is this:
double calculationResult = 12.0; QString displayValue = qFuzzyCompare(calculationResult, static_cast<qint64>(calculationResult)) ? QString::number(static_cast<qint64>(calculationResult)) : QString::number(calculationResult, 'f');
-
You either calculate a double or an int, can't be both.
Anyway, what you probably want is this:How can it be acceptable!? All calculator around the world do calculations on both types. Furthermore, when I write
2.3
+4.6
, it shows:6.900000
!
That is it works fine neither for ints nor for doubles.double calculationResult = 12.0; QString displayValue = qFuzzyCompare(calculationResult, static_cast<qint64>(calculationResult) ? QString::number(static_cast<qint64>(calculationResult)) : QString::number(calculationResult, 'f');
Ow my God! Isn't there any simpler way?
Please have a look at Windows built-in calculator. See this how simple and nifty shows results.
Do you say that behind that Windows' calculator there would be such a long statement just for showing numbers in decimal mode, if it were written by C++/Qt? -
@tomy said in Showing numbers in decimal not scientific notation:
How can it be acceptable!? All calculator around the world do calculations on both types. Furthermore, when I write 2.3+4.6, it shows: 6.900000!
No they do calculation in the widest possible type they support (here it's double) and then display the result as appropriate. Further reading on implicit type promotions in c++ can be found here
Ow my God! Isn't there any simpler way?
This is a simple
if-else
statement with the notable exception that it compares floating point values as they should be compared.Do you say that behind that Windows' calculator there would be such a long statement just for showing numbers in decimal mode, if it were written by C++/Qt?
Yes, I'm sure of it. It's probably even much longer as windows is actually written in C.
-
I used this:
ss = qFuzzyCompare(expression(), static_cast<qint64>(expression()) ? QString::number(static_cast<qint64>(expression())) : QString::number(expression(), 'f')); result_box -> setText(ss);
ss
is a QString.
expression()
returns anint
ordouble
value.
result_box
is alineEdit
which shows the result of the calculations.I get this error:
C:\Users\ME\Documents\Qt\My_First_Calculator\my_first_calculator.cpp:81: error: no matching function for call to 'qFuzzyCompare(double, QString)'
QString::number(expression(), 'f'));
^ -
@tomy said in Showing numbers in decimal not scientific notation:
expression() returns an int or double value.
I'm pretty sure that functions returns a string, not an
int
, nor adouble
. You need to convert the string to an actual number if you want to use it as such, e.g. see here. -
expression() returns an int or double value.
I'm pretty sure that functions returns a string, not an
int
, nor adouble
.Don't be that sure. :)
I have this method in my code:double My_First_Calculator::expression()
But I think this error is of that
ss
is aQString
.