из string в число
От: Slavic_137  
Дата: 22.07.08 14:34
Оценка:
Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double
Re: из string в число
От: jazzer Россия Skype: enerjazzer
Дата: 22.07.08 14:41
Оценка:
Здравствуйте, Slavic_137, Вы писали:

S_>Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double


если скорость не критична: boost::lexical_cast<int>(str), boost::lexical_cast<double>(str)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: из string в число
От: _Paul Россия  
Дата: 22.07.08 15:05
Оценка: 2 (1)
Здравствуйте, Slavic_137, Вы писали:

atoi, atof от s.c_str()
Re: из string в число
От: ulong Россия  
Дата: 22.07.08 15:18
Оценка: 7 (2) +1
    std::string s( "123" );
    std::stringstream ss;
    int i;
    ss << s;
    ss >> i;


Здравствуйте, Slavic_137, Вы писали:

S_>Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double
Re: из string в число
От: игппук Беларусь  
Дата: 22.07.08 15:59
Оценка: 2 (1)
sscanf
проклятый антисутенерский закон
Re[2]: из string в число
От: Vamp Россия  
Дата: 22.07.08 18:21
Оценка: 3 (1) :))
Если не рассматривать всякие сложные варианты типа экспоненциальной записи и не проверять валидность , то вот:


        double result = 0.0;
        bool decimal = false;
        int dp = 10;
        for (string::iterator it = str.begin(), e = str.end(); it != e; ++it) {
                if (*it == '.' ) {
                        decimal = true;
                } else {
                        float value = *it - '0';
                        if (!decimal) {
                                result = result * 10 + value;
                        } else {
                                double fr = value / dp;
                                result += fr;
                                dp *= 10;
                        }
                }
        }
Да здравствует мыло душистое и веревка пушистая.
Re: из string в число
От: Аноним  
Дата: 23.07.08 08:50
Оценка: 3 (1)
Здравствуйте, Slavic_137, Вы писали:

S_>Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double

Например так:
std::string s1="123";
int a=atoi(s1.c_str());
std::string s2="123.45";
double b=atof(s2.c_str());
Re[2]: из string в число
От: Аноним  
Дата: 23.07.08 14:39
Оценка:
Нашёл этот способ когда-то давно в гугле. Там было написано, что это самый что не на есть C++-ный способ преобразования.
Мне интересно, что думают знатоки из этого подфорума о таком методе. По-моему, создавать поток под такую операцию — это @$*()$*@#*, не говоря уже о 5 строчках кода. Или я чего-то не понимаю. В своё время сам им пользовался, но плевался.

Здравствуйте, ulong, Вы писали:
U>
U>    std::string s( "123" );
U>    std::stringstream ss;
U>    int i;
U>    ss << s;
U>    ss >> i;
U>


U>Здравствуйте, Slavic_137, Вы писали:


S_>>Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double
Re[3]: из string в число
От: alzt  
Дата: 23.07.08 14:52
Оценка: 4 (2)
Здравствуйте, Аноним, Вы писали:

А>Нашёл этот способ когда-то давно в гугле. Там было написано, что это самый что не на есть C++-ный способ преобразования.

А>Мне интересно, что думают знатоки из этого подфорума о таком методе. По-моему, создавать поток под такую операцию — это @$*()$*@#*, не говоря уже о 5 строчках кода. Или я чего-то не понимаю. В своё время сам им пользовался, но плевался.

А>Здравствуйте, ulong, Вы писали:

U>>
U>>    std::string s( "123" );
U>>    std::stringstream ss;
U>>    int i;
U>>    ss << s;
U>>    ss >> i;
U>>


Вообще количество строк не аргумент, при проверке ошибок объём кода обычно увеличивается.
Но в данном случае попробуйте переписать сл. образом:

    std::string s( "123" );//входные данные, без них никак
    int i = 0;//переменная для результата, тоже никак

    std::stringstream ss(s);//1-я строка 
    ss >> i;//2-я строка


и количество строк уменьшается до 2-х.
На мой взгляд метод хороший — мы имеем 2 типа на входе, операцию "заполнения" второй переменной результатом первой. Интуитивно понятно и достаточно надёжно.
Re: из string в число
От: Slavic_137  
Дата: 23.07.08 17:10
Оценка:
Всем огромное спасибо!
Re[2]: из string в число
От: seimur  
Дата: 24.07.08 06:46
Оценка:
Здравствуйте, ulong, Вы писали:

U>
U>    std::string s( "123" );
U>    std::stringstream ss;
U>    int i;
U>    ss << s;
U>    ss >> i;
U>


U>Здравствуйте, Slavic_137, Вы писали:


S_>>Здравствуйте. Скажи пожалуqста как перевести строку класса string в число типа int и типа double



std::istringstream iss("123");
int i;
  iss >> i;
Теоретически нет разницы между теорией и практикой, но на практике она есть
Re[3]: из string в число
От: _Paul Россия  
Дата: 24.07.08 11:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашёл этот способ когда-то давно в гугле. Там было написано, что это самый что не на есть C++-ный способ преобразования.

А>Мне интересно, что думают знатоки из этого подфорума о таком методе. По-моему, создавать поток под такую операцию — это @$*()$*@#*, не говоря уже о 5 строчках кода. Или я чего-то не понимаю. В своё время сам им пользовался, но плевался.

А>Здравствуйте, ulong, Вы писали:

U>>
U>>    std::string s( "123" );
U>>    std::stringstream ss;
U>>    int i;
U>>    ss << s;
U>>    ss >> i;
U>>


Чтобы не плеваться можно использовать boost::lexical_cast или (если по каким-то причинам boost не используется) один раз написать функцию вроде такой:

template < class Target, class Source > Target lexical_cast( const Source & source )
{
  std::stringstream   interpreter;
  Target              target;

  if ( !(interpreter << source) || !(interpreter >> target)
    || !(interpreter >> std::ws).eof() )
    throw std::bad_cast("bad lexical cast: source type value could not be interpreted as target");

  return target;
}


Используется так же как и boost::lexical_cast:
int i = lexical_cast<int>(std::string("123"));
double pi = lexical_cast<double>(std::string("3.1415926"));


Если не устраивает скорость работы такого варианта по сравнению с atoi и atof, то можно написать соответсвующие специализации шаблона функции lexical_cast:
template <> int lexical_cast<int>( const std::string & source ) { return atoi(s.c_str()); }
template <> double lexical_cast<double>( const std::string & source ) { return atof(s.c_str()); }
// ... и т.п.


Таким образом мы получим универсальное решение, применимое для любых типов и с оптимальным быстродействием.
Re[4]: из string в число, offtop std::ws
От: alzt  
Дата: 25.07.08 09:47
Оценка:
Здравствуйте, _Paul, Вы писали:

_P>Чтобы не плеваться можно использовать boost::lexical_cast или (если по каким-то причинам boost не используется) один раз написать функцию вроде такой:


_P>
_P>template < class Target, class Source > Target lexical_cast( const Source & source )
_P>{
_P>  std::stringstream   interpreter;
_P>  Target              target;

_P>  if ( !(interpreter << source) || !(interpreter >> target)
_P>    || !(interpreter >> std::ws).eof() )
_P>    throw std::bad_cast("bad lexical cast: source type value could not be interpreted as target");

_P>  return target;
_P>}
_P>


А для чего здесь строка "!(interpreter >> std::ws).eof()"?
Re[5]: из string в число, offtop std::ws
От: VoidEx  
Дата: 25.07.08 11:09
Оценка: 9 (2)
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, _Paul, Вы писали:


A>А для чего здесь строка "!(interpreter >> std::ws).eof()"?


Чтобы это не ело: "12ddd"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.