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. -
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. -
@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-coutConcordo 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' comeQString::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