локализация — изменение локали для всех io в коде c ++

Я использую библиотеку E57 (http://www.libe57.org/) и у меня есть набор данных e57, который я могу правильно их прочитать, когда десятичная точка в окнах установлена ​​на «.», но в системе с десятичной точкой «,» она не работает должным образом (например, на окна с языком, установленным на Испанию или Норвегию и несколько других европейских языков).

Чтобы проверить правильность моего кода, я использую приложение demoRead, которое поставляется этой библиотекой.

Я вижу, что, когда локальные значения установлены так, что десятичная точка равна «.», Приложение может читать данные для точки как:

 x=0.24965 y=-0.1595 z=-0.29536

но если я изменю десятичную точку в настройках Windows на ‘,’ тогда приложение прочитает эти значения:

 x=24965 y=-15950 z=-29536

Поскольку я не хочу смотреть на ошибку в этой большой библиотеке, мне интересно, есть ли способ, которым я могу изменить локальные значения для моего приложения в коде?

Я уже пытался сделать это с помощью этого кода:

 setlocale(LC_ALL,"en-US");

без успеха. Можно ли каким-либо образом изменить символ десятичной точки в коде, который влияет на все операции ввода-вывода, даже если они находятся глубоко внутри библиотеки?

0

Решение

libE57 — это библиотека C ++. Следовательно, соответствующий стандартный компонент библиотеки должен быть <locale> и не <clocale>,

setlocale() устанавливает языковой стандарт и влияет на многие функции стандартной библиотеки c, такие как printf(), scanf() и функции c-string. Но это имеет не оказывает прямого влияния на библиотеку C ++.

Языковой стандарт c ++ влияет на стандартную библиотеку c ++, например, на потоки, такие как стандартные потоки, потоки файлов или строковые потоки. По умолчанию языковой стандарт установлен на язык «C» по умолчанию. Вы можете изменить это на языковой стандарт Windows:

locale::global(locale(""));  // sets locale according to OS environment

И вы можете установить его обратно на значение по умолчанию (с «.» В качестве десятичного разделителя):

locale::global(locale("C"));  // set locale to default locale

Однако такое изменение влияет только на новые созданные потоки. Уже открытые потоки, такие как, например, cin и cout, сохранят локаль, которая была установлена ​​при их открытии. Конечно, вы можете изменить:

cout.imbue (myloc);  // change locale use by one speciifc stream
//myloc is a locale that was created using default
1

Другие решения

Вы можете установить LC_NUMERIC для десятичной точки. Для денежного форматирования вы можете установить LC_MONETARY.

LC_NUMERIC только для «семейства printf» и localeconv

http://msdn.microsoft.com/en-us/library/x99tb11d.aspx

0

По вопросам рекламы [email protected]