2016-02-09 15 views
7

Ho due applicazioni di esempio che utilizzano la stessa libreria e la differenza principale tra di loro è che si utilizza qt e l'altra applicazione è un'applicazione di console.const char * per raddoppiare il problema di traduzione con C++

Nella libreria comune, ho questo codice di prova:

double test = 0.1; 
double test2 = atof("2.13134"); 
double test3 = atof("1,12345"); 

I valori se uso l'applicazione non qt sono:

test = 0.10000000000001 
test2 = 2.1323399999999999998 
test3 = 1 // This is the expected result using a ',' as delimitation character 

Ma con l'applicazione qt:

test = 0.10000000000001 
test2 = 2  // This is not expected!!! 
test3 = 1.1234500000000000001 

C'è qualche caso in cui il comportamento di 'atof' cambia perché qt?

+0

Qt utilizza pre-elaborazione del codice, che potrebbe fare le cose ungood. O potrebbe esserci qualche macro in gioco. –

+0

@ Cheersandhth.-Alf Questo sembra più un problema locale (ricordate che ',' è il carattere del punto decimale in molte locali) - forse Qt sta impostando un locale non predefinito in base alle impostazioni del sistema? – Angew

+0

Per qualcuno dalla Germania, l'applicazione Qt è corretta. – PaulMcKenzie

risposta

7

std::atof dipende dal locale attualmente impostato per indicare quale carattere è il punto decimale. Nel caso predefinito ("C locale"), questo è il carattere del periodo ".".

È probabile che Qt stia impostando le impostazioni internazionali su qualcos'altro. È possibile ripristinare che utilizzando il standard C[++] mechanism:

std::setlocale(LC_ALL, "C"); 
+0

Ho incluso 'std :: setlocale (LC_ALL, "C");' nel costruttore della classe nella libreria, e ora funziona. Grazie!!! – goe

+0

@goe: Potrebbe essere una buona idea controllare se i letterali string stringhe con caratteri internazionali ora finiscono correttamente come stringhe Qt. –

4

Il problema che si nota è probabilmente causato dalla nozione di locale di Qt. È possibile utilizzare:

QLocale::setDefault(QLocale::C); 

per farlo funzionare come atof.

Aggiornamento

Sembra QLocale::setDefault non imposta l'impostazione internazionale predefinita usato da Qt. Imposta semplicemente le impostazioni internazionali predefinite che verranno create quando si costruisce un QLocale. Vedi Changing locale in Qt e la risposta accettata per maggiori informazioni.

Problemi correlati