У меня есть два примера приложений, использующих одну и ту же библиотеку, и основное различие между ними заключается в том, что одно использует qt, а другое — консольное приложение.
В общей библиотеке у меня есть этот тестовый код:
double test = 0.1;
double test2 = atof("2.13134");
double test3 = atof("1,12345");
Значения, если я использую приложение не-qt:
test = 0.10000000000001
test2 = 2.1323399999999999998
test3 = 1 // This is the expected result using a ',' as delimitation character
Но с приложением qt:
test = 0.10000000000001
test2 = 2 // This is not expected!!!
test3 = 1.1234500000000000001
Есть ли случай, когда поведение atof меняется из-за qt?
std::atof
зависит от текущей установленной локали, чтобы сказать ей, какой символ является десятичной точкой. В случае по умолчанию («C locale») это символ точки ‘.
».
Вполне вероятно, что Qt устанавливает локаль на что-то другое. Вы можете вернуть это, используя стандартный механизм C [++]:
std::setlocale(LC_ALL, "C");
Проблема, которую вы заметили, скорее всего, вызвана представлением Qt о локали. Ты можешь использовать:
QLocale::setDefault(QLocale::C);
заставить его работать как atof
,
Обновить
Похоже на то QLocale::setDefault
не устанавливает язык по умолчанию, используемый Qt. Он просто устанавливает локаль по умолчанию, которая будет создана при создании QLocale
, Увидеть Изменение локали в Qt и принятый ответ для получения дополнительной информации.