|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/371.32 03 Oct 2000 16:34:51 To : Igor Mikhailov Subject : Re: Mason -------------------------------------------------------------------------------- <Igor_Mikhailov@p21.f42.n5005.z2.fidonet.org> wrote: IM> Linux login: Artem IM> password: :-P IM>>>> Так вот эта ошибка вылечилась у меня простым занесением 0.8 в IM>>>> кавычки: return '0.8'; MS>>> Это Джонатан Шварц все забывает исправить этот глючок. MS>>> Проявляется, когда локаль не английская (а именнно разделитель MS>>> десятичной дроби не точка) AC>> Да, настоятельно рекомендуется таки ставить локаль так, чтобы AC>> разделитель десятичной дроби был точкой (LC_NUMERIC=C). И чтобы дату AC>> отдавал по-английски (LC_TIME=C). А то глюков не оберешься. IM> Предлагаю это в FAQ. AC>> У нас вот недавно перл из-за setlocale(LC_ALL,'ru_RU.KOI8-R') AC>> отказался умножать на 0.01. Во была песня, пока нашли... IM> Хорошо, а почему у меня: IM> % locale IM> LANG=ru_RU.KOI8-R IM> LC_CTYPE="ru_RU.KOI8-R" IM> LC_NUMERIC="ru_RU.KOI8-R" IM> LC_TIME="ru_RU.KOI8-R" IM> LC_COLLATE="ru_RU.KOI8-R" IM> LC_MONETARY="ru_RU.KOI8-R" IM> LC_MESSAGES="ru_RU.KOI8-R" IM> LC_ALL= IM> Hо IM> ------------------------- IM> use locale; IM> use POSIX qw (locale_h); IM> setlocale(LC_ALL,'ru_RU.KOI8-R'); IM> print scalar(localtime),"\n"; IM> print 0.9*0.1,"\n"; IM> ----------------------------- IM> Tue Sep 26 05:30:37 2000 # по англ. почему? IM> 0,09 # здесь с запятыми. и проблем при компиляции IM> # нету. почему же в мазоне есть? ----------------------------- А так IM> : ---------------------------- use locale; use POSIX qw IM> (locale_h); setlocale(LC_ALL,'ru_RU.KOI8-R'); setlocale(LC_NUMERIC,'C'); pri IM> nt scalar(localtime),"\n"; print IM> 0.9*0.1,"\n"; ------------------------------- Tue Sep 26 05:31:51 2000 IM> # все также, почему? 0.09 # здесь IM> нормально. ------------------------------ Подозреваю, что у тебя более хитрая локаль либо скрипты _компилируются_ при LC_NUMERIC=C, то есть к моменту выполнения setlocale(LC_ALL,'ru_RU.KOI8-R'); перл уже знает, что на что надо умножать. Hо еще не знает, как выводить. Минимальный работающий пример с обломом: 16:30:08.ttypts/3@Menegroth> locale LANG=ru_RU.KOI8-R LC_CTYPE="ru_RU.KOI8-R" LC_NUMERIC=ru_RU.KOI8-R LC_TIME=POSIX LC_COLLATE="ru_RU.KOI8-R" LC_MONETARY="ru_RU.KOI8-R" LC_MESSAGES=POSIX LC_ALL= (LC_NUMERIC выставлено явно) 16:32:48.ttypts/3@Menegroth> cat mytest.pm package mytest; use locale; use POSIX qw(locale_h); setlocale(LC_NUMERIC,'ru_RU.KOI8-R'); 1; 16:33:25.ttypts/3@Menegroth> cat test.pl #!/usr/bin/perl -w use mytest; print 0.9*0.1,"\n"; 16:33:23.ttypts/3@Menegroth> perl test.pl 0 Тут setlocale вызывается _до_ компиляции остатка кода скрипта. IM> И кстати, в плане оффтопика: mysql сортирует неправильно koi8r строки. Моя IM> локаль выше. Скомпилен mysql не так, или я что то не так делаю (как у него IM> узнать параметры компиляции)? Hикаких телодвижений для того, чтоб он IM> выдавал мне все правильно я не делаю. Просто делаю запрос с order by name IM> - возвращает не правильно. Причем даже в своем консольном клиенте. mysql IM> Ver 9.35 Distrib 3.22.26a, for pc-linux-gnu (i686) MySQL, как большой, из соображений производительности чихать хотел на локаль. Его надо собирать с --with-charset=koi8_ru, тогда соответствующие таблицы вкомпилируются. И клиентские библиотеки тоже. В документации это описано, в отдельном разделе. -- Счастливо! Ран. --- ifmail v.2.14.os-p7-tma3 * Origin: MemoNet (2:5020/371.32@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/17121eb578f97.html, оценка из 5, голосов 10
|