Showing numbers in decimal not scientific notation



  • Hi all,

    In may app I have a double variable:

    double d;
    

    When the result of 10^6 goes to that variable, it shows it this way: 1e+06
    How to do to make the app show the result in decimal, 1000000?


  • Moderators

    @tomy
    Where do you want to see a fixed number?


  • Moderators

    @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?



  • Hi @tomy

    I don't know if this is what you want, but if you wanna keep only the decimal part of your double you can cast your double to int, you can do something like this :

    (int)(10^6)



  • @koahnig
    The number, "1e+06", will be sent to a QTextStream which has the address of a QString. Then that string will be sent to a lineEdit. and finally LineEdit will show the number in scientific notation.



  • @Chris-Kawa
    I run it in standard mode (ctrl + R).



  • @mostefa
    No dear. I don't want it.


  • Moderators

    @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
    

  • Moderators

    12 is not a double, it's an int. 12.0 is a double and 12.0f is a float.
    So anyway, like I said earlier, either

    QString 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



  • @VRonin

    lineEdit->setText(lineEdit->locale().toString(1257.147862,'f'));

    There is no s in your lineEdit!

    lineEdit -> setText( // here s should be put!)
    


  • ok, I guess...

    QString s;
    s=lineEdit->locale().toString(1257.147862,'f');
    lineEdit -> setText(s);
    


  • @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 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.


  • Qt Champions 2016

    @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');
    


  • @kshegunov

    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?


  • Qt Champions 2016

    @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 an int or double value.
    result_box is a lineEdit 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'));
    ^


  • Qt Champions 2016

    @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 a double. You need to convert the string to an actual number if you want to use it as such, e.g. see here.



  • @kshegunov

    expression() returns an int or double value.

    I'm pretty sure that functions returns a string, not an int, nor a double.

    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 a QString.



  • @tomy Did you even try my solution?



  • @VRonin

    Should I use it this way:

    QString ss;
    ss = result_box -> locale().toString(1257.147862,'f');
    QTextStream (&ss) << expression();
    result_box -> setText(ss);
    

    ?



  • @tomy No, don't use QTextStream you don't need something like stringstream to pass numbers to string.

    QString ss;
    ss = result_box -> locale().toString(expression(),'f');
    result_box -> setText(ss);
    

    or more concisely, result_box->setText(result_box->locale().toString(expression(),'f'));



  • @VRonin said in Showing numbers in decimal not scientific notation:

    @tomy No, don't use QTextStream you don't need something like stringstream to pass numbers to string.

    QString ss;
    ss = result_box -> locale().toString(expression(),'f');
    result_box -> setText(ss);
    

    I used it. 2 + 3 = 5.000000 :( :(



  • what is result_box and what is inside expression()?



  • @VRonin

    what is result_box

    It's a lineEdit.

    and what is inside expression()?

    It returns only a double value. Consider something simple like:

    double My_First_Calculator::expression()
    {
       double d1, d2;    // these d1, d2 are gotten from input E.g. d1 = 2, d2 = 3.5
      if(_ch == '+') return d1+d2;  // _ch is a previously defined varible 
     else if (_ch == '-') return d1-d2;  // and so on
    }
    


  • I simplified the code as follows. This, too, has exactly that problem:

    test.h

    #ifndef TEST_H
    #define TEST_H
    #include <QDialog>
    
    class QLineEdit;
    class QPushButton;
    
    class test : public QDialog
    {
        Q_OBJECT
    public:
        test(QWidget* parent = 0);
    
    private slots:
        void expression();
    
    private:
        QLineEdit* result_box;
        QPushButton* equal;
        QPushButton* quit;
    };
    
    #endif // TEST_H
    

    test.cpp

    #include <QtWidgets>
    #include "test.h"
    
    test::test(QWidget* parent) : QDialog(parent)
    {
      result_box = new QLineEdit;
      equal = new QPushButton(tr("="));
      quit = new QPushButton(tr("Close"));
    
    
      connect(quit, SIGNAL(clicked(bool)), this, SLOT(close()));
      connect(equal,SIGNAL(clicked(bool)), this, SLOT(expression()));
    
      QHBoxLayout* layout = new QHBoxLayout;
      layout -> addWidget(result_box);
      layout -> addWidget(equal);
      layout -> addWidget(quit);
    
      setLayout(layout);
    }
    
    //******************
    
    void test::expression()
    {
        QString ss;
        double d = 1000000;
        QTextStream (&ss) << d;
        result_box -> setText(ss);
    }
    

    And main.cpp

    #include <QApplication>
    #include "test.h"
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        test t;
        t.show();
    
       return app.exec();
    }
    

    Just run it and click on the = button.



  • I think I should write a code for it like this:

    if( d is like an int number)
        result_box -> setText(QString::number(d , 'f', 0));
    else if ( d is a double number with n numbers after point)
       result_box -> setText(QString::number(d , 'f', n));
    

  • Moderators

    @tomy
    Maybe you should have a look to the docs as well. E.g. here

    In case of integer assignment that would be:

    int i = 10;
    result_box -> setText ( QString::number( i ) );
    

  • Qt Champions 2016

    @tomy said in Showing numbers in decimal not scientific notation:

    Don't be that sure. :)

    Yes! There's a typo in the code ... :)

    ss = qFuzzyCompare(expression(),
                     static_cast<qint64>(expression()) ? //< Missing a )
                     QString::number(static_cast<qint64>(expression())) :
                     QString::number(expression(), 'f')); //< Extra )
    

    What you want is to have the if with qFuzzyCompare, not with the static cast. It should rather read like this:

    ss = qFuzzyCompare(expression(), static_cast<qint64>(expression())) ?
                     QString::number(static_cast<qint64>(expression())) :
                     QString::number(expression(), 'f');
    

    If you wish you can of course use the usual if-else construct, not the ternary operator, so the last snippet'd be equivalent to:

    if (qFuzzyCompare(expression(), static_cast<qint64>(expression()))
        ss = QString::number(static_cast<qint64>(expression()));
    else
        ss = QString::number(expression(), 'f');
    


  • This post is deleted!


  • @kshegunov

    What you want is to have the if with qFuzzyCompare, not with the static cast. It should rather read like this:

    ss = qFuzzyCompare(expression(), static_cast<qint64>(expression())) ?
                     QString::number(static_cast<qint64>(expression())) :
                     QString::number(expression(), 'f');
    

    If you wish you can of course use the usual if-else construct, not the ternary operator, so the last snippet'd be equivalent to:

    if (qFuzzyCompare(expression(), static_cast<qint64>(expression()))
        ss = QString::number(static_cast<qint64>(expression()));
    else
        ss = QString::number(expression(), 'f');
    

    Sorry, I don't know how I tested it but it doesn't work as it's expected! :(
    for example:
    2 + 3 = 5 OK
    10 ^ 6 = 1000000 OK
    2 + 1.5 = 3.500000 !!!

    That is, the function QString::number(expression(), 'f'); (with the default precision 6) shows all range of precision whether it's need or not!

    Maybe it's what we need:
    http://doc.qt.io/qt-5/qtextstream.html#setRealNumberNotation
    But how to use it? Docs doesn't offer a little example of it to show how beginners should use it. !!!!!!
    (Docs are not for learners/beginners, they are for professionals — if they are professional, so they don't need Docs much => Docs are not useful)


  • Qt Champions 2016

    What you want to do in the floating point case is not at all trivial. Here you can read on that topic if you are willing to digest the math.

    The simpler but inefficient approach is to save the floating point text representation and just discard all the trailing 0 characters manually.

    EDIT:
    Here's (probably) the most concise way, but requires knowledge of regular expressions, which is yet again for you to read on to understand how or why it works:

    if (qFuzzyCompare(expression(), static_cast<qint64>(expression()))
        ss = QString::number(static_cast<qint64>(expression()));
    else  {
        ss = QString::number(expression(), 'f', 17);
        ss.replace(QRegularExpression("\\.?0+$"), "");
    }
    

    (Docs are not for learners/beginners, they are for professionals — if they are professional, so they don't need Docs much => Docs are not useful)

    You got that backwards. The point of the Qt docs is they are a documentation for Qt itself, they will give no instruction into C++, its types, the types' memory layout and other such technical topics. If you are in need of that, then you need to look elsewhere, for example http://en.cppreference.com/w/



  • @kshegunov

    The point of the Qt docs is they are a documentation for Qt itself, they will give no instruction into C++, its types, the types' memory layout and other such technical topics.

    Thanks but I didn't talk about C++, but Docs.
    I thought we can look at the Docs as a set of instructions useful for learners to be used to Qt, because they have been frequently suggested to new comers of Qt for reading.
    Thanks also for your code.


  • Moderators

    @tomy Qt documentation is not a set of instructions and it will never be. It is just not possible to have instructions for every use case you can imagine.
    Qt documentation documents Qt API and provides some examples. For specific use cases you need to think about it, read Qt documentation, try out. This is same for all frameworks I was using so far.



  • You are wasting your time trying to learn programming and c++ just by looking at the Qt docs... talk about an uphill hike :p


  • Qt Champions 2016

    @tomy said in Showing numbers in decimal not scientific notation:

    I thought we can look at the Docs as a set of instructions useful for learners to be used to Qt, because they have been frequently suggested to new comers of Qt for reading.

    You can, but the implication is you have a decent knowledge of C++ before that, as Qt is a library that's written and intended to be used from (among others) C++ code. So these are two separate issues you need to address. Learning about Qt without a good fundament is (and always will be) a very, very hard thing to do. Think about it like this, you wouldn't start writing a book in a foreign language, unless you're very intimately familiar with the actual language, right?



  • @kshegunov
    First off, I like your attitude. And I wish we all believe in Democracy. Indeed, I use a book for learning Qt. But it's sometimes possible to refer to a good resource for a topic. I know Docs are in a high position in Qt folk's perspectives, but if I can use democracy and say my opinion, I say, "I have not found them useful up to now".
    It may change. I've joined Qt just recently.
    Thanks for your talks.


  • Moderators

    @tomy It is perfectly fine to tell others your opinion. But it is as well perfectly fine for others to disagree with you :-)



  • Hi,

    for your specific situation, I would suggest something like:

    QString truncValue(double value, int prec)
    {
        QString sReturn = QString::number(value,'f',prec);
        if(sReturn.endsWith("0")){
            while(sReturn.endsWith("0"))
                sReturn.remove(sReturn.length()-1,1);
    
            if(sReturn.endsWith("."))
                sReturn.remove(sReturn.length()-1,1);
        }
        
        return sReturn;
    }
    

    But, this is successively chaining a lot of string operations. The previously mentions methods are probably better.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.