Здравствуйте, 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
Здравствуйте, Аноним, Вы писали:
А>Нашёл этот способ когда-то давно в гугле. Там было написано, что это самый что не на есть 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 типа на входе, операцию "заполнения" второй переменной результатом первой. Интуитивно понятно и достаточно надёжно.
Здравствуйте, Аноним, Вы писали:
А>Нашёл этот способ когда-то давно в гугле. Там было написано, что это самый что не на есть 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:
Здравствуйте, _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()"?