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] dair-spb.livejournal.com 2012-01-22 08:13 pm (UTC)(link)
Чото у меня даже с локалью ru_RU.UTF-8 strtod воспринимает точку, но не запятую.

[identity profile] metaclass.livejournal.com 2012-01-22 08:21 pm (UTC)(link)
LC_NUMERIC="ru_RU.... ?

[identity profile] dair-spb.livejournal.com 2012-01-22 08:22 pm (UTC)(link)
LC_NUMERIC="ru_RU.UTF-8"

готов проверить с любым другим значением

[identity profile] metaclass.livejournal.com 2012-01-22 08:28 pm (UTC)(link)
 d = strtod("1.2",&t);
 printf("%f\n",d);

 setlocale(LC_NUMERIC,"ru_RU.UTF8");
 d = strtod("1,2",&t);
 printf("%f\n",d);


все работает, как положено, выдает 1.2 и 1,2

[identity profile] dair-spb.livejournal.com 2012-01-22 08:36 pm (UTC)(link)
а, да, анонимный комментатор прав.

если специально вызвать setlocale, то всё "ломается".

Блин.

(Anonymous) 2012-01-22 08:31 pm (UTC)(link)
а setlocale(LC_ALL, "") сначала дёргали? а то оно без лишних телодвижений локаль из переменных окружения не ухватит.

--
xaep