Я использую библиотеку 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");
без успеха. Можно ли каким-либо образом изменить символ десятичной точки в коде, который влияет на все операции ввода-вывода, даже если они находятся глубоко внутри библиотеки?
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
Вы можете установить LC_NUMERIC для десятичной точки. Для денежного форматирования вы можете установить LC_MONETARY.
LC_NUMERIC только для «семейства printf» и localeconv