crossplatform.ru

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


  Ответ в Особенности функции atof
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
kwisp Дата 5.10.2010, 13:03
 
Цитата
$ 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 - этим ты локаль вроде не портишь
NordWest Дата 5.10.2010, 12:52
  Не очень понял всех докладчиков. У меня такая проблема. На 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); - то же самое. Если считывать данные из файла - результат будет аналогичным. А мне нужно и локаль себе не портить системную и чтобы программа работала с точками.
Andrew Selivanov Дата 27.8.2008, 12:37
  А вот std::stringstream (#include <sstream>) как стандартный способ преобразования почему-то никто и не вспомнил... :rolleyes:
AD Дата 26.8.2008, 13:16
 
Цитата(Tonal @ 26.8.2008, 13:59) *
И что ты с америкосовской записью будешь делать где тысячи запятой отделяются а десятые точкой?
Я же говорю - разделитель от локали зависит.

А кому вопрос? :)

Да и... я разве спорил с этим?

Цитата
1) Указывать в приложении напрямую setlocale()!
Tonal Дата 26.8.2008, 12:59
  И что ты с америкосовской записью будешь делать где тысячи запятой отделяются а десятые точкой?
Я же говорю - разделитель от локали зависит.
AD Дата 26.8.2008, 12:04
 
Цитата
вообще я думаю так бы оно и должно бы быть, а отделять группы разрядов можно и сверху (апострофом)
Но америкосы используют для этого запятую.

Ну это уже локальные вещи. В крайних случаях при работе с такими заказчиками просто заранее обсуждать эти моменты!!! На примере Германии я уже показал, что я не один такой, который считает, что оба разделителя считать адекватными!
Litkevich Yuriy Дата 26.8.2008, 11:44
 
Цитата(AD @ 26.8.2008, 15:37) *
функция преобразует и строчку "1234,45" and "1234.45"

вообще я думаю так бы оно и должно бы быть, а отделять группы разрядов можно и сверху (апострофом)
Но америкосы используют для этого запятую.
AD Дата 26.8.2008, 11:37
  Покопался в 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. Немцы молодцы! :)
 QLocale::setDefault(QLocale::C);
 d = QString( "1234,56" ).toDouble(&ok); // ok=false
 d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56

 QLocale::setDefault(QLocale::German);
 d = QString( "1234,56" ).toDouble(&ok); // ok=true, d = 1234.56
 d = QString( "1234.56" ).toDouble(&ok); // ok=true, d = 1234.56
Tonal Дата 25.8.2008, 7:21
  Программисту нужно следить за тем, чтобы было удобно пользоваться его программой.
А за тем, что удобно было программисту должна отвечать среда программирования: язык, библиотеки, IDE...

Представь, что строители начали строить дома ориентируясь только на то как ми удобно, мы бы жили в ямах и шалашиках из плит - это всяко проще "построить" чем возводить нормальный дом. :)
niXman Дата 23.8.2008, 14:03
  AD, Не подумал бы :o: Спасибо, буду внимателен.
Цитата(Litkevich Yuriy @ 20.8.2008, 6:21) *
а по мне дак это чушь полная, т.к. в исходном коде программ десятичный разделитель всегда был точкой!

Абсолютно верно!
Цитата(Tonal @ 20.8.2008, 14:30) *
Но в связи с повсеместным распространением кривых программ, которые не учитывают локаль, сейчас часто используют и точку и запятую.

Я всегда, в независимости от локали, заменяю запятую на точку, до передачи функции.
Цитата(AD @ 21.8.2008, 23:16) *
Лично по мне, так я не считаю удобным то, что программисту приходится следить за тем, что поставлено: точка или запятая. Мне кажется, что надо бы было сделать функцию так, чтобы она понимала оба этих разделителя одновременно.

Опять верно!
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 18:15