Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование типов данных


Автор: UnixBeginner 16.1.2006, 14:45
Необходимо преобразовать численный тип в строку.
Использовать только стандартные средства.
Есть предположение что нужно использовать потоковые итераторы,
т.е. сначала туда ввести число,
а потом из него вывести это число и присвоить его строке.

Задумка есть, а конкретно как это реализовать, не знаю.
Помогите.

Автор: Mayk 16.1.2006, 14:53
1) int a = atoi ("123")
2) int a; std::istringstream str("123"); str >> a;

Автор: UnixBeginner 16.1.2006, 15:10
Все, уже сделал сам.
Может кому понадобится:

Код


#include <sstream>

template< typename T>
string atob(T num)
{
        ostringstream *ostr = new ostringstream;
        ostr << num;
        string retVal = ostr->str();
        delete ostr;
        return retVal;
}



Если у кого есть другие идеи и возможно лучше, то давайте....
Добавлено @ 15:21
Цитата(Mayk @ 16.1.2006, 14:53)
1) int a = atoi ("123")
2) int a; std::istringstream str("123"); str >> a;

а это наоборот, перевод строки в число.

Автор: LuckLess 16.1.2006, 15:35
я бы обощил твой код
UnixBeginner
Код

...
template<class T>
std::string ToString(const T& Val){
std::ostringstream ostr;
ostr << Val;
return ostr.str();
}
...

Автор: UnixBeginner 16.1.2006, 15:48
Цитата

я бы обощил твой код


Да, наврное так быдет лучше. smile

Автор: comcon1 16.1.2006, 17:14
Этот код уже обобщили и переобобщили до Вас. Причем примерно таким же путем.
Использование:
Код

double a = 434.232;
std::string str;
str = boost::lexical_cast<std::string>(a);

Причем если для типа, который у меня double определен оператор ostream & << (ostream &, const type &), то этот тип также может преобразовываться при помощи этой команды.

А реализация этого шаблона идейно такое же, тока более универсальная. Он в контрукторе пишет в istringstream и читает оттуда строку.

Автор: blackofe 17.1.2006, 20:29
к сожалению itoa() не входит в стандарт ANSI C (наверное, как следствие, в stl). но ведь есть еще sprintf():

Код

#include <cstdio>
#using namespace std;

int main()
{
    char buf[16];
    int a = 12345;
    sprintf(buf, "%d", a);
    printf("%s\n", buf);
    return 0;
}

Автор: np9mi7 17.1.2006, 22:31
UnixBeginner, используй строковые потоки, но вот задумка с new вообще лишняя;

Автор: chipset 17.1.2006, 23:39
Цитата(np9mi7 @ 17.1.2006, 12:31 Найти цитируемый пост)

UnixBeginner, используй строковые потоки

Можно поподробнее?

Автор: Daevaorn 18.1.2006, 00:44
Цитата(chipset @ 17.1.2006, 23:39 Найти цитируемый пост)

Можно поподробнее?

Наверно имеется ввиду std::stringstream и прочие

Автор: LuckLess 18.1.2006, 01:33
comcon1
boost - не стандарт.
вопрос про стандартные средства.

Автор: UnixBeginner 18.1.2006, 09:27
Как раз std::ostingstream и имеется ввиду. Посмотрите примеры выше,
например 3-й по счету:
Код

#include <sstream>    
template< typename T>    
string atob(T num)    
{    
        ostringstream ostr;
        ostr << num;
        return ostr.str()l;    
}


Вот вам и использование строковых потоков. Все работает, проверено.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)