С++ сбросить локаль на C глобально?

В проекте, над которым я сейчас работаю, я ссылаюсь на проприетарную динамическую библиотеку. Как только я запускаю функцию инициализации библиотеки, поведение регистрации и печати чисел меняется.

Запятые расставлены после каждого третьего десятичного знака. Т.е.

cout << 123456789 << endl

раньше печатал 123456789, а теперь печатает 123,456,789. Это ужасно раздражает, потому что такое поведение не то, что я хочу.

Эта проблема проявляется не только в бинарном файле, который я компилирую, но также проявляется во всех couts и stringstreams в библиотеках, которые я связываю с ним.

Я попытался использовать эту строку кода после вызова функции инициализации

setlocale(LC_ALL,"C");

думая, что это может сбросить мою локаль по умолчанию; но безрезультатно. Запятые остаются!!

Этот фрагмент кода:

std::cout.imbue(std::locale("C"));

работает, чтобы сбросить локаль couts, и каждый stringstream я тоже применяю ее. Однако действительно ли мне нужно вызывать imbue для КАЖДОГО stringstream, объявленного в КАЖДОЙ библиотеке, на которую я ссылаюсь? Есть некоторые проприетарные библиотеки, и я не могу изменить их исходный код.

Должен ли быть способ сбросить локаль обратно на "C" глобально?


person dinkelk    schedule 19.06.2013    source источник


Ответы (1)


Я считаю, что std::locale::global(std::locale("C")); должен помочь. См. http://en.cppreference.com/w/cpp/locale/locale/global

Обратите внимание, что это влияет только на потоки, созданные после этого вызова.

Любые потоки, такие как cout, которые уже были заполнены другой библиотекой, должны быть повторно заполнены до желаемой локали по умолчанию.

И, наконец, я настоятельно рекомендую подать отчет о дефекте библиотеки, которую вы используете, потому что совершенно неоправданно в одностороннем порядке вносить такие поразительные глобальные изменения в вашу функцию инициализации.

person Mark B    schedule 19.06.2013
comment
да, но OP должен помнить, что locale::global (как указано на связанной странице) влияет только на потоки, созданные после вызова. Итак, cin, cout, cerr и другие потоки не пропитаны глобальной локалью, это нужно делать вручную; - person Massa; 20.06.2013
comment
@Марк Б, спасибо. Это работало как сон. @Massa, спасибо за понимание. Итак, я могу предположить, что streams наследуют локаль любой глобальной локали на момент их объявления? - person dinkelk; 20.06.2013
comment
они наследуют локаль глобальной локали в момент их инициализации (они могут быть объявлены как члены класса и инициализированы в конструкторах и т.д. и т.п.) - person Massa; 20.06.2013