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


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Ещё раз - для ввода пользователя десятичный разделитель зависит от локали. Если в локали прописано, что разделитель должен быть символ + значит его и нужно корректно обрабатывать.

У нас в стране с этим просто бардак, как и со всем остальным.
Но, по возможности, этот бардак нужно уменьшать - при отображении и выводе документов использовать то, что прописано (кстати Qt именно так и делает - посмотри QDoubleSpinBox например).
При вводе либо запрещать вводить другой, либо корректировать.
Для текстовых форматов - следовать спецификациям. Если спецификации нет или нои не точные - предоставлять возможность настройки.
При создании своих текстовых, читаемых пользователями форматов, учитывать и сохранять текущую локаль.

Цитата
Это не в стране разруха а в головах. (с)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Текстовая версия Сейчас: 22.6.2025, 22:12