Языковой стандарт времени выполнения C устанавливается setlocale
.Языковой стандарт стандартной библиотеки C ++ (STL) устанавливается классом std::locale
и может устанавливаться для отдельных объектов STL, таких как std :: istringstream и т. Д.
Функция _configthreadlocale(_ENABLE_PER_THREAD_LOCALE)
позволяет установить языковой стандарт C Runtimeдля каждого потока.
К сожалению, кажется, что объекты STL в потоках, в которых включено _configthreadlocale(_ENABLE_PER_THREAD_LOCALE)
, используют языковой стандарт времени выполнения C.Или, по крайней мере, используя десятичную точку локали C Runtime.
В потоках без _ENABLE_PER_THREAD_LOCALE
проблем нет.
Нечто подобное было задано Paavo в 2008 году, но без ответов: _configthreadlocale и localeconv
Следующий код показывает проблему:
//Enable per thread locale in current thread
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)
//Create istringstream object
std::istringstream LibraryStream;
//Create double object
double Value = 0;
//Create std::locale object with "C" locale ("." as decimal point)
std::locale StreamLoc("C");
//Set C Runtime locale to danish ("," as decimal point)
setlocale(LC_ALL, "danish");
//Set the "C" locale on the istringstream object
LibraryStream.imbue(StreamLoc);
//Get the locale of the istringstream object for test (returns "C" as expected)
std::locale NewStreamLoc = LibraryStream.getloc();
//Set floating point string with "C" locale decimal point in istringstream object
LibraryStream.str("60.258351");
//Convert the string to double
LibraryStream >> Value;
//Now the expected value of "Value" is 60.258351, but it is 60.000
//when debugging the conversion, I can see that "," is used as decimal point
Кто-нибудь сталкивался с этим раньше?Я делаю что-то неправильно?Есть ли предложения по решениям?
Заранее спасибо / TEB