Где взять swprintf_l под linux ?
От: chipmunk  
Дата: 23.09.15 19:37
Оценка:
Функция есть в Windows, Mac, BSD, но нет почему-то в Linux

Та которая стандартная swprintf зависит от текущей локали, что очень не хорошо. Каждый раз переключать глобальную локаль ну очень бы не хотелось, да и не безопасно в многопоточной среде.

А задача весьма простая — быстро конвертировать тип double в std::wstring и дробный разделитель должен быть всегда точкой независимо от текущей локали.
swprintf_l linux
Re: Где взять swprintf_l под linux ?
От: const_volatile  
Дата: 23.09.15 20:37
Оценка:
Здравствуйте, chipmunk, Вы писали:

C>Функция есть в Windows, Mac, BSD, но нет почему-то в Linux


C>Та которая стандартная swprintf зависит от текущей локали, что очень не хорошо. Каждый раз переключать глобальную локаль ну очень бы не хотелось, да и не безопасно в многопоточной среде.


C>А задача весьма простая — быстро конвертировать тип double в std::wstring и дробный разделитель должен быть всегда точкой независимо от текущей локали.


а обязательно printf? можно ведь и средствами c++
std::wstring double2wstring (double n)
{
    std::wostringstream os;
    os.imbue (std::locale::classic());
    os << n;
    return os.str();
}
Re[2]: Где взять swprintf_l под linux ?
От: chipmunk  
Дата: 23.09.15 21:25
Оценка:
Здравствуйте, const_volatile, Вы писали:

_>а обязательно printf? можно ведь и средствами c++

_>
_>std::wstring double2wstring (double n)
_>{
_>    std::wostringstream os;
_>    os.imbue (std::locale::classic());
_>    os << n;
_>    return os.str();
_>}
_>


очень медленно так к сожалению
Re: Где взять swprintf_l под linux ?
От: Pavel Dvorkin Россия  
Дата: 24.09.15 03:20
Оценка:
Здравствуйте, chipmunk, Вы писали:

C>Та которая стандартная swprintf зависит от текущей локали, что очень не хорошо. Каждый раз переключать глобальную локаль ну очень бы не хотелось, да и не безопасно в многопоточной среде.


Уверен, что в линуксе локаль у процесса ? В Windows локаль у потока, так что переключать ее там вполне безопасно.
With best regards
Pavel Dvorkin
Re[2]: Где взять swprintf_l под linux ?
От: chipmunk  
Дата: 24.09.15 11:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Уверен, что в линуксе локаль у процесса ? В Windows локаль у потока, так что переключать ее там вполне безопасно.


Даже если и безопасно, каждый раз ее переключать и восстанавливать получается еще медленнее чем с помощью stringstream.

Может кто знает какие библиотеки которые умеют очень быстро конверировать число в строку и наоборот.
Re[3]: Где взять swprintf_l под linux ?
От: Pavel Dvorkin Россия  
Дата: 24.09.15 14:53
Оценка: 4 (1)
Здравствуйте, chipmunk, Вы писали:

C>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Уверен, что в линуксе локаль у процесса ? В Windows локаль у потока, так что переключать ее там вполне безопасно.


C>Даже если и безопасно, каждый раз ее переключать и восстанавливать получается еще медленнее чем с помощью stringstream.


C>Может кто знает какие библиотеки которые умеют очень быстро конверировать число в строку и наоборот.


Посмотри еще fcvt. Она в стандарт не входит

http://www.c-cpp.ru/content/fcvt

Если не подойдет, то вот тут какая-то ее версия, вроде как без локалей.

http://piumarta.com/software/fcvt/fcvt-1.1/fcvt.c
With best regards
Pavel Dvorkin
Re[3]: Где взять swprintf_l под linux ?
От: Хон Гиль Дон Россия  
Дата: 29.09.15 07:39
Оценка: 4 (1)
Здравствуйте, chipmunk, Вы писали:

C>Даже если и безопасно, каждый раз ее переключать и восстанавливать получается еще медленнее чем с помощью stringstream.


C>Может кто знает какие библиотеки которые умеют очень быстро конверировать число в строку и наоборот.


Буст спирит же — карма, ци.

Вывод —

boost::spirit::karma::generate(output_iter(bio_), boost::spirit::short_, t);


Ввод

boost::spirit::qi::parse(first, last, boost::spirit::qi::ulong_long, v);

Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Где взять swprintf_l под linux ?
От: MShura  
Дата: 29.09.15 13:45
Оценка:
C>А задача весьма простая — быстро конвертировать тип double в std::wstring и дробный разделитель должен быть всегда точкой независимо от текущей локали.

Когда мне понадобилось использовать точку в качестве разделителя, то я поступил так (работает и в windows и в linux)

правда я не пользовался std, а обычный libc

char s_decimal_point[2] = {'.', 0}; // глобальная переменная

// в main
struct lconv * cnv = localeconv();
cnv->decimal_point = s_decimal_point;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.