Numero di decimali nella conversione QString in toDouble()



  • Salve a tutti.
    Non riesco a salvare su un double il numero corretto che inserisco in un QLineEdit.
    Mi spiego meglio.
    In una QLineEdit inserisco ad esempio il numero 123.45678
    quando lo memorizzo in un double, ottengo un valore troncato alla terza cifra decimale.
    Il codice che uso è il seguente:

    QString qstr = myLineEdit->text();
    double d = qstr.toDouble(&ok);

    Il risultato che ottengo è ok=true e d=123.457
    Se stampo
    cout << qstr.toStdString() << endl;
    ottengo il valore correttamente inserito "123.45678"
    ma la stampa del double
    cout << d << endl;
    è 123.457
    Fino a quando inserisco nel QLineEdit un valore che non supera 6 numeri, il double d è corretto, ma quando inserisco un valore con più di 6 numeri ottengo un double d troncato.
    Come posso fare?
    Grazie.
    Sto usando la versione 5.6.2 di Qt.



  • @silvio ,

    qDebug() << qSetRealNumberPrecision(10) << "d = " << d << endl;



  • @silvio said in Numero di decimali nella conversione QString in toDouble():

    double

    Uauuu .. in italiano.. :-)
    mi fa piacere ... qt ha le sue preferenze in fatto di tipi di numeri decimali o interi..
    in quei casi metto il tutto i un QVariant il quale mi trasforma meglio il risultato...
    http://doc.qt.io/qt-5/qvariant.html
    e cosi on tanti altri formati... e giuro che quello che restituisce QVariant è sempre perfetto anche le proprie lassi fatte o altri tipi..
    Poi per i numeri esistono i campi apposta per i numeri .. tipo QSpinBox e qcombobox vedi gli esempi .. non li so a memoria tutti..
    pure io vedo i fari nomi nel UI designer quando li faccio..



  • QVariant serve per salvare dati di cui non si sa il tipo a priori. Qui e' semplicemente un problema di come std::cout stampa i numeri. Non e' un problema realtivo a Qt. Qui trovi la soluzione: https://stackoverflow.com/questions/554063/how-do-i-print-a-double-value-with-full-precision-using-cout

    Concordo comunque sul fatto che per l'input di numeri QDoubleSpinBox e' preferibile



  • Scusate, ho trovato il problema!
    Come suggerito da Vinod, ho provato a stampare a video il numero double, utilizzando qDebug() ed ho ottenuto il risultato corretto.
    Questo mi fa capire che il problema non è nella memorizzazione del numero
    double d = qstr.toDouble(&ok);
    ma nel modo in cui il numero double lo voglio visualizzare in una QLineEdit.
    Inizialmente il mio codice era del tipo:

    QString qstr = myLineEdit->text();
    double d = qstr.toDouble(&ok);
    ....
    qstr = QString::number(d);
    myLineEdit1->setText(qstr);

    In questo caso, se nella myLineEdit scrivo "123.456789"
    nella myLineEdit1 ottengo "123.457"

    Ho semplicemente modificato la riga:
    qstr = QString::number(d);
    e l'ho sostituita con
    qstr = QString::number(d, 'g', 10);

    in questo modo nella myLineEdit1 ottengo il numero corretto "123.456789"

    Grazie a tutti per il contributo e l'interessamento.
    Buona giornata.



  • Nota a margine: QString::number non e' localizzato cosi' come QString::toDouble.

    Se inserisci un numero in numeri non-arabi (ebraici, cinesi, etc.) o semplicemente usi un separatore decimale diverso dalla convenzione inglese (usi la virgola invece del punto) nulla funziona.

    Quando gestisci coversioni tra stringa e numeri con la stringa esposta all'utente finale dovresti sempre usare usare QLocale

    • double d = myLineEdit1->locale().toDouble(qstr,&ok);
    • qstr = myLineEdit1->locale().toString(d, 'g', 10);

    o, come suggerito in precedenza, usa uno spinbox che fa il lavoro per te


Log in to reply
 

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