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% похер, но мало ли).

(no subject)

[identity profile] max630.livejournal.com - 2012-01-22 22:41 (UTC) - Expand

[identity profile] justy-tylor.livejournal.com 2012-01-22 07:45 pm (UTC)(link)
Вставить в проект кусочек public domain кода, который делает это независимо от рантайма.

[identity profile] metaclass.livejournal.com 2012-01-22 08:06 pm (UTC)(link)
А потом у меня юниоры спрашивают "а чего это у тебя половина стандартной либы в свою собственную библиотеку вынесена" :)

(no subject)

[identity profile] gds.livejournal.com - 2012-01-22 20:09 (UTC) - Expand

(no subject)

[identity profile] qehgt.livejournal.com - 2012-01-22 20:12 (UTC) - Expand

(no subject)

[identity profile] justy-tylor.livejournal.com - 2012-01-22 20:36 (UTC) - Expand

(Anonymous) 2012-01-22 07:46 pm (UTC)(link)
судя по всему никак, без своих или сторонних велосипедов(типа glib и т.д.)

--
xaep

[identity profile] hshhhhh.livejournal.com 2012-01-23 06:24 am (UTC)(link)
Внезапно -- хаер!

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

(no subject)

[identity profile] dair-spb.livejournal.com - 2012-01-22 20:22 (UTC) - Expand

[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

(no subject)

[identity profile] dair-spb.livejournal.com - 2012-01-22 20:36 (UTC) - Expand

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

--
xaep

[identity profile] madeveloper.livejournal.com 2012-01-22 09:14 pm (UTC)(link)
Плюсы не катят? Там можно stringstream со своей locale.

[identity profile] metaclass.livejournal.com 2012-01-22 09:23 pm (UTC)(link)
Счас придет айсед и накажет за упоминание плюсов :)

(no subject)

[identity profile] madeveloper.livejournal.com - 2012-01-23 19:52 (UTC) - Expand

[identity profile] tzirechnoy.livejournal.com 2012-01-22 09:35 pm (UTC)(link)
1) Вы используете трэды? Тогда мы летим к вам (злобные баги).
2) Мнение, что разделителем можэт быть запятая -- это ересь, посему setlocale(LC_NUMERIC, "C")
3) char *dot;
if ((dot = strchr(s, '.'))) {
*dot = *nl_langinfo(RADIXCHAR);
}

[identity profile] fas-tm.livejournal.com 2012-01-22 09:39 pm (UTC)(link)
А как без них писать GUI нормальное ? А долгоиграющие бэкграунд воркеры ?
Расскажите.

(no subject)

[identity profile] theiced.livejournal.com - 2012-01-23 06:42 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 06:59 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 08:23 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 08:36 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 10:17 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 10:39 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 11:37 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 12:06 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 12:14 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 12:25 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 12:40 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 17:48 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 18:31 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 20:56 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 17:46 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 08:54 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 08:55 (UTC) - Expand

(no subject)

[identity profile] fas-tm.livejournal.com - 2012-01-23 09:46 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 10:43 (UTC) - Expand

(no subject)

[identity profile] fas-tm.livejournal.com - 2012-01-23 10:59 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 11:20 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 11:40 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 11:53 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 17:54 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 18:34 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 17:53 (UTC) - Expand

(no subject)

[identity profile] tzirechnoy.livejournal.com - 2012-01-23 17:51 (UTC) - Expand

[identity profile] max630.livejournal.com 2012-01-22 10:28 pm (UTC)(link)
*scanf игнорирует локаль, afaik

[identity profile] max630.livejournal.com 2012-01-22 10:36 pm (UTC)(link)
хм, не игнорирует.

[identity profile] freetiger.livejournal.com 2012-01-22 11:25 pm (UTC)(link)
положено-не знаю, я я бы делал компонент gui-платформа-предобертка как принцип

[identity profile] freetiger.livejournal.com 2012-01-23 12:39 am (UTC)(link)
положено-не знаю, я я бы делал компонент gui-платформа-предобертка как принцип

[identity profile] antontsau.livejournal.com 2012-01-23 02:40 am (UTC)(link)
настоящие юзеры в советских бухгалтериях пишут И точку И запятую. Типа 100.000,500 (ну или наоборот). Я на это нарвался еще в 86 году. Кто-то в какой-то замкадской дыре заполнил бумажный статопросник именно так, другой юзер ни на секунду не усомнясь ввел это в ЕСину, а у меня в статистике получились два и две трети библиотекаря.

[identity profile] blackyblack.livejournal.com 2012-01-23 05:01 am (UTC)(link)
Я всю жизнь думал, что strtod только с точкой разделителем работает... Как выяснилось, локаль всё-таки влияет. Но вон ниже пишут, что влияет локаль только если явно задать, а по умолчанию, видимо, должна быть точка.
Соответственно, решение может быть такое:
а) не указывать локаль, а в си само не подхватится.
б) указать явно какую-нибудь адекватную в самом начале программы.

[identity profile] anatoly borodin (from livejournal.com) 2012-01-23 05:45 am (UTC)(link)
> setlocale(LC_NUMERIC,"C"); чо-то не рекомендуют, говорят, не thread-safe.


Синглтон, фигле.

[identity profile] thedeemon.livejournal.com 2012-01-23 07:01 am (UTC)(link)
расскажите про синглтоны в Си, и про контролирование порядка их инициализации, пожалуйста

(no subject)

[identity profile] metaclass.livejournal.com - 2012-01-23 07:10 (UTC) - Expand

(no subject)

[identity profile] blackyblack.livejournal.com - 2012-01-23 07:16 (UTC) - Expand

(no subject)

[identity profile] anatoly borodin - 2012-01-23 07:19 (UTC) - Expand

(no subject)

[identity profile] anatoly borodin - 2012-01-23 07:21 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 07:50 (UTC) - Expand

(no subject)

[identity profile] gineer.livejournal.com - 2012-01-23 15:52 (UTC) - Expand

[identity profile] tzirechnoy.livejournal.com 2012-01-23 08:58 am (UTC)(link)
Ну, в общем, да. Но трэды -- всё равно зло.

[identity profile] vp.livejournal.com 2012-01-23 07:12 am (UTC)(link)
Откуда вообще в нашей стране в качестве разделителя взялась запятая? Бесед.

[identity profile] anatoly borodin (from livejournal.com) 2012-01-23 07:26 am (UTC)(link)
А в Германии откуда, в Италии? Точка только у пиндосов, киви и чайна: en.wikipedia.org/wiki/Decimal_mark#Hindu-Arabic_numeral_system

И почему в Вашей стране тангенс называется tg, хотя во всём остальном мире он tan?

(no subject)

[identity profile] blackyblack.livejournal.com - 2012-01-23 09:59 (UTC) - Expand