Особенности функции atof |
Здравствуйте, гость ( Вход | Регистрация )
Особенности функции atof |
Tonal |
22.8.2008, 11:45
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Ещё раз - для ввода пользователя десятичный разделитель зависит от локали. Если в локали прописано, что разделитель должен быть символ + значит его и нужно корректно обрабатывать.
У нас в стране с этим просто бардак, как и со всем остальным. Но, по возможности, этот бардак нужно уменьшать - при отображении и выводе документов использовать то, что прописано (кстати Qt именно так и делает - посмотри QDoubleSpinBox например). При вводе либо запрещать вводить другой, либо корректировать. Для текстовых форматов - следовать спецификациям. Если спецификации нет или нои не точные - предоставлять возможность настройки. При создании своих текстовых, читаемых пользователями форматов, учитывать и сохранять текущую локаль. Цитата Это не в стране разруха а в головах. (с)
|
|
|
niXman |
23.8.2008, 14:03
Сообщение
#12
|
Участник Группа: Участник Сообщений: 169 Регистрация: 18.6.2008 Пользователь №: 204 Спасибо сказали: 1 раз(а) Репутация: 0 |
AD, Не подумал бы Спасибо, буду внимателен.
а по мне дак это чушь полная, т.к. в исходном коде программ десятичный разделитель всегда был точкой! Абсолютно верно! Но в связи с повсеместным распространением кривых программ, которые не учитывают локаль, сейчас часто используют и точку и запятую. Я всегда, в независимости от локали, заменяю запятую на точку, до передачи функции. Лично по мне, так я не считаю удобным то, что программисту приходится следить за тем, что поставлено: точка или запятая. Мне кажется, что надо бы было сделать функцию так, чтобы она понимала оба этих разделителя одновременно. Опять верно! |
|
|
Tonal |
25.8.2008, 7:21
Сообщение
#13
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Программисту нужно следить за тем, чтобы было удобно пользоваться его программой.
А за тем, что удобно было программисту должна отвечать среда программирования: язык, библиотеки, IDE... Представь, что строители начали строить дома ориентируясь только на то как ми удобно, мы бы жили в ямах и шалашиках из плит - это всяко проще "построить" чем возводить нормальный дом. Сообщение отредактировал Tonal - 25.8.2008, 7:21 |
|
|
AD |
26.8.2008, 11:37
Сообщение
#14
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Покопался в Qt-шных аналогах функции atof! Выяснилось, что функция ToDouble(bool* ok) тоже зависит от локали. Но есть отличия:
1) есть возможность увидеть ошибку быстрее, так как программисту предлагают после преобразования проверять значение ok 2) очень важное отличие - при установке такого формата setlocale(LC_ALL, 0) функция преобразует и строчку "1234,45" and "1234.45" в вещественное число 1234.45! Так что, если используете библиотеку Qt есть такие советы: 1) Указывать в приложении напрямую setlocale()! 2) Использовать qt-шные средства преобразования в вещественные числа! Преобразование легче отследить и немного универсальнее! P.S. Немцы молодцы!
Сообщение отредактировал AD - 26.8.2008, 11:38 |
|
|
Litkevich Yuriy |
26.8.2008, 11:44
Сообщение
#15
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
AD |
26.8.2008, 12:04
Сообщение
#16
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Цитата вообще я думаю так бы оно и должно бы быть, а отделять группы разрядов можно и сверху (апострофом) Но америкосы используют для этого запятую. Ну это уже локальные вещи. В крайних случаях при работе с такими заказчиками просто заранее обсуждать эти моменты!!! На примере Германии я уже показал, что я не один такой, который считает, что оба разделителя считать адекватными! |
|
|
Tonal |
26.8.2008, 12:59
Сообщение
#17
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
И что ты с америкосовской записью будешь делать где тысячи запятой отделяются а десятые точкой?
Я же говорю - разделитель от локали зависит. |
|
|
AD |
26.8.2008, 13:16
Сообщение
#18
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
|
|
|
Andrew Selivanov |
27.8.2008, 12:37
Сообщение
#19
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
А вот std::stringstream (#include <sstream>) как стандартный способ преобразования почему-то никто и не вспомнил...
|
|
|
NordWest |
5.10.2010, 12:52
Сообщение
#20
|
Студент Группа: Участник Сообщений: 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= В вычислениях везде точки и под виндой проблем не возникает. В линуксе же воспринимаются запятые, а у чисел точками отбрасывается дробная часть. Вот например код:
Если в командной строке ввести 15.5, то d=15, а если 15,5 - 15.5. Причём qDebug() выдает точки. Пишу вначале main команду setlocale(LC_ALL, 0); - результата тот же. С QLocale::setDefault(QLocale::C); - то же самое. Если считывать данные из файла - результат будет аналогичным. А мне нужно и локаль себе не портить системную и чтобы программа работала с точками. |
|
|
Текстовая версия | Сейчас: 3.1.2025, 12:56 |