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)! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kwisp
  опции профиля:
сообщение 5.10.2010, 13:03
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата
$ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC=C
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=


$ cat ./main.cpp 
# include <iostream>
# include <cstdlib>

int main(int a, char** b)
{
  double d = 0;
  while (a>0)
  {
      d = atof(b[--a]);
    std::cout<< d << '\n';
  }
  return 0;
}


Цитата
$ ./a.out 15.5 14.2
14.2
15.5
0

все как видишь работает
LC_NUMERIC=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 Текстовая версия Сейчас: 27.6.2025, 9:31