metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-01-22 10:36 pm

atof, strtod и локаль.

Внезапно: а вот как положено в коде на С конвертить строку в double, если мы точно знаем, что в строке десятичный разделитель ".", и точно знаем, что код будут запускать на системе с адовыми локалями, у которых разделитель "," типа русской, белорусской итд? В дотнете, как положено, есть функция с параметром для локали и инвариантная локаль InvariantCulture. А в олдскульно-кошерном C как? setlocale(LC_NUMERIC,"C"); чо-то не рекомендуют, говорят, не thread-safe.

[identity profile] nicka-startcev.livejournal.com 2012-01-22 07:39 pm (UTC)(link)
не тред-сэйф -- значит вызвать один раз глобально, до того, как наплодить кучку тредов!

[identity profile] metaclass.livejournal.com 2012-01-22 07:41 pm (UTC)(link)
Ок. Если будет работа с гуем - юзера увидят разделитель не в своей локали (им в 99% похер, но мало ли).

[identity profile] nicka-startcev.livejournal.com 2012-01-22 07:50 pm (UTC)(link)
или руками предформатировать строку перед atof/strtod

[identity profile] max630.livejournal.com 2012-01-22 10:41 pm (UTC)(link)
Я думаю число тех кому не похер примерно равно числу тех кто охуеет от того что точка не принимается. Так что лучше похер.

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