crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 18.4.2024, 21:03