2016-06-10 15 views
1

Ich habe ein Qt-Projekt gestartet und mit C++ - Code verbunden, den ich geschrieben habe, um eine Datei zu parsen. Dieser Code verwendet std :: stod(), um double-Werte zu analysieren, und funktioniert in einem einfachen C++ - Projekt, aber bei Verwendung mit einer Qt-Anwendung gibt std :: stod() nur den ganzzahligen Teil der Zahl zurück.Andere Werte von std :: stod() und QString :: toDouble() in Qt5 erhalten

Ich schrieb und lief einige Test-Code, einer mit g ++ 6.1 kompiliert, und der andere mit qmake 5.6 und der gleichen g ++. Die Ergebnisse sind die gleichen wie die Ergebnisse meiner Projekte.

Code mit g ++ kompiliert:

#include <iostream> 

int main(int argc, char ** argv) 
{ 
    const std::string number("3.14"); 
    double dbl = std::stod(number); 

    std::cout << dbl << '\n'; // 3.14 

    return 0; 
} 

Es zeigt den guten Wert: 3.14

Code mit Qt kompiliert:

#include <QCoreApplication> 
#include <QDebug> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    const std::string snumber("3.14"); 
    const QString qnumber = QString::fromStdString("3.14"); 

    double std_d = std::stod(snumber); 
    double qt_d = qnumber.toDouble(); 

    qDebug() << std_d << qt_d;     // 3 3.14 
    std::cout << std_d << ' ' << qt_d << '\n'; // 3 3.14 

    return a.exec(); 
} 

Können Sie mir sagen, warum std :: stod() verhält sich so?

Antwort

5

Da std::stod irreparabel defekt ist und in der Hölle brennen sollte in Bezug auf std::strtod implementiert, die interpretiert verdoppelt entsprechend der aktuellen locale. QString verwendet stattdessen immer das Gebietsschema C (verwenden Sie QLocale für Gebietsschema-spezifische Konvertierungen).

Das Erstellen der QCoreApplication -Instanz verursacht einen Aufruf an setlocale(LC_ALL, ""), der das Gebietsschema des Prozesses entsprechend der Umgebung festlegt und so das Verhalten std::stod ändert.

+0

Wow, daran hätte ich nie gedacht ... Ich habe es in der Dokumentation gelesen, aber ich hätte nie gedacht, dass die Zahlenformate so unterschiedlich sein können. Was sollte ich anstelle von Stod verwenden? – Shumush

+0

Nun, unter welchem ​​(numerischen) Gebietsschema sind Sie? Unter den meisten europäischen/russischen/südamerikanischen Gebietsschemas ist das Dezimaltrennzeichen ein Komma (','), kein Punkt ('.'), Z. '3,14'. – peppe

+0

Es gibt keine andere Lösung als die eigene 'strtod' /' atof' Implementierung, Sie können Rubys oder FreeBSDs verwenden. – peppe