crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

AD
  опции профиля:
сообщение 19.8.2008, 16:27
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вчера увидел одну немаловажную особенность С-шной функции atof, о которой хотел всех предупредить.
Ну во-первых, функция переводит строковое значение числа в вещественное число. Особенность функции заключается в том, что этот перевод зависит от locale, которое устанавливается функцией setlocale! Например, если в приложении установлено вот так:
setlocale(LC_ALL, ".ACP");
// тогда 
double d = atof("0.4"); // d =0.0 
double d1 = atof("0,4"); // d1 =0.4

Т.е. в данной системе знаковым разделителем будет являться запятая.
А если вот так:
setlocale(LC_ALL, 0);
// тогда 
double d = atof("0.4"); // d =0.4 
double d1 = atof("0,4"); // d1 =0.0


Помните об этой особенности, если пользуетесь подобными функциями (не Qt)! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
NordWest
  опции профиля:
сообщение 5.10.2010, 12:52
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Не очень понял всех докладчиков. У меня такая проблема. На debian стоят такие локали:
Цитата
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=


В вычислениях везде точки и под виндой проблем не возникает. В линуксе же воспринимаются запятые, а у чисел точками отбрасывается дробная часть. Вот например код:
int main(int argc, char *argv[])
{
...
double d = atof(argv[3]);
...
}


Если в командной строке ввести 15.5, то d=15, а если 15,5 - 15.5. Причём qDebug() выдает точки.
Пишу вначале main команду setlocale(LC_ALL, 0); - результата тот же. С QLocale::setDefault(QLocale::C); - то же самое. Если считывать данные из файла - результат будет аналогичным. А мне нужно и локаль себе не портить системную и чтобы программа работала с точками.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Особенности функции atof   19.8.2008, 16:27
- - void*   AD, это вполне ясное свойство, т.к. в разных стран...   19.8.2008, 19:14
|- - AD   Цитата(void* @ 19.8.2008, 20:14) AD, это ...   19.8.2008, 20:37
- - Litkevich Yuriy   Цитата(void* @ 19.8.2008, 23:14) AD, это ...   20.8.2008, 5:21
- - Tonal   А при чём тут исходный код? Эта функция для преобр...   20.8.2008, 13:30
- - Litkevich Yuriy   Tonal, для случая с переменной передаваемой в эту ...   20.8.2008, 13:39
- - Tonal   Ну так в исходнике можно и напрямую числовым литер...   20.8.2008, 13:57
- - Litkevich Yuriy   Цитата(Tonal @ 20.8.2008, 17:57) А на уро...   20.8.2008, 14:37
|- - Tonal   Цитата(Litkevich Yuriy @ 20.8.2008, 18:37...   21.8.2008, 10:59
|- - AD   Цитата(Tonal @ 21.8.2008, 11:59) Они не б...   21.8.2008, 22:16
- - Tonal   Ещё раз - для ввода пользователя десятичный раздел...   22.8.2008, 11:45
- - niXman   AD, Не подумал бы Спасибо, буду внимателен. Цита...   23.8.2008, 14:03
- - Tonal   Программисту нужно следить за тем, чтобы было удоб...   25.8.2008, 7:21
|- - AD   Покопался в Qt-шных аналогах функции atof! Выя...   26.8.2008, 11:37
- - Litkevich Yuriy   Цитата(AD @ 26.8.2008, 15:37) функция пре...   26.8.2008, 11:44
|- - AD   Цитатавообще я думаю так бы оно и должно бы быть, ...   26.8.2008, 12:04
- - Tonal   И что ты с америкосовской записью будешь делать гд...   26.8.2008, 12:59
|- - AD   Цитата(Tonal @ 26.8.2008, 13:59) И что ты...   26.8.2008, 13:16
- - Andrew Selivanov   А вот std::stringstream (#include <sstream>)...   27.8.2008, 12:37
- - NordWest   Не очень понял всех докладчиков. У меня такая проб...   5.10.2010, 12:52
- - kwisp   Цитата$ locale LANG=ru_RU.utf8 LC_CTYPE=...   5.10.2010, 13:03


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 1:41