LINUX.ORG.RU

[C] Вывод значения double в файл и setlocale

 


0

0

Есть программа, одна из ее функций сама формирует простенький SVG-файл. Проблема в том, что в SVG в качестве разделителя допустима толька точка, а в программе во многих локалях нужна естественно запятая, причем сейчас переключать локаль приходится довольно часто.

Два вопроса:
1. Возможно кто-нибудь в курсе, как сообщить в документе SVG, что разделителем будет запятая или иной символ (xml charset на это не влияет).
2. Возможно есть какой то кроссплатформенный ключик для printf, чтобы использовать определенный разделитель?
3. Как лучше переключать локаль через setlocale? Пока это делается вызовами setlocale(LC_NUMERIC, "C") и setlocale(LC_NUMERIC, curlocale). В man-ах ко всем платформам нашел интересную заметку (цитата из POSIX):
The string returned by setlocale() is such that a subsequent call with that string and its associated category shall restore that part of the program's locale. The application shall not modify the string returned which may be overwritten by a subsequent call to setlocale().

То есть получается, что можно делать примерно так для ускорения переключения локалей:
oldlocale = setlocale(LC_NUMERIC, "C");
setlocale(LC_NUMERIC, oldlocale);

P.S. Вопрос не только в скорости, но и в том, как правильно делать операцию временной смены локали.

★★★★★

> В man-ах ко всем платформам нашел интересную заметку (цитата из POSIX): The string returned by setlocale() is such that a subsequent call with that string and its associated category shall restore that part of the program's locale. The application shall not modify the string returned which may be overwritten by a subsequent call to setlocale().
То есть получается, что можно делать примерно так для ускорения переключения локалей:
oldlocale = setlocale(LC_NUMERIC, "C");
setlocale(LC_NUMERIC, oldlocale);

ну по-идее такая конструкция вполне валидна.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>> То есть получается, что можно делать примерно так для ускорения переключения локалей:

>> oldlocale = setlocale(LC_NUMERIC, "C");

>> setlocale(LC_NUMERIC, oldlocale); > ну по-идее такая конструкция вполне валидна. Больше интересует на всех ли платформах она работает так, как мне нужно ;-) Валидность понятна. Будет ли при втором setlocale происходить возврат к старой локали или нет?

saper ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.