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


Автор: koren 1.5.2010, 17:48
Как перевести double в string?

1.233333e+20
2.3333333333333333333333333

не округляя и не меняя структуру числа

Как задать округление числа после точки на количество знаков?
просто cout.precision(2) округляет по количеству знаков всего числа, а не те после точки

И еще меняю - есть число 2300000
Как его преобразовать в 2.3е+06 и обратно (наверное через sprintf - но там плохо идёт округление)?

Моя цель организовать функцию QString::number(double num, char type, int precision) под консоль без Qt (char type - 'f', 'g', 'e'
)

Автор: Voldemar2004 1.5.2010, 18:01
koren, в C++ Builder есть 
Код

FloatToStr();

Автор: Peter 1.5.2010, 18:01
Непонятен вопрос. В смысле, надо сделать так же, как выводит функция printf()? Напечатать в строку:
Код
char s[50];
sprintf(s, "%e", chislo); // в виде 1.233333e+20, т.е. с выделенной мантиссой
std::string ss = s;

Автор: Voldemar2004 1.5.2010, 18:05
koren, вот: 

Код

#include <string>
using namespace std;

double val = 1.233333e+20;
string buf=FloatToStr(val).c_str();
ShowMessage(buf.c_str());


все работает smile

Автор: azesmcar 1.5.2010, 18:14
Цитата(Voldemar2004 @  1.5.2010,  18:01 Найти цитируемый пост)
koren, в C++ Builder есть 

А разве это тема по C++ Builder?

Цитата(koren @  1.5.2010,  17:48 Найти цитируемый пост)
Как перевести double в string?

sprintf - в си
boost::lexical_cast, stringstream - в C++

Код

std::string str = boost::lexical_cast<std::string>(5.7);

Код

std::ostringstream stream;
stream << 5.7;
std::string str = stream.str();

Автор: koren 1.5.2010, 19:15
Цитата(Peter @ 1.5.2010,  18:01)
Непонятен вопрос. В смысле, надо сделать так же, как выводит функция printf()? Напечатать в строку:
Код
char s[50];
sprintf(s, "%e", chislo); // в виде 1.233333e+20, т.е. с выделенной мантиссой
std::string ss = s;

с char не заданной длины

Автор: Voldemar2004 1.5.2010, 21:41
koren, можно:

Код

#include <sstream>
#include <iostream>

//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{

std::ostringstream stream;
stream << 2.3333;
std::string str = stream.str();

char* Out;
strcpy(Out, (char*)stream.str().c_str());

std::cout<<Out;

std::cin.get();

return 0;
}
//---------------------------------------------------------------------------


Цитата(koren @  1.5.2010,  20:15 Найти цитируемый пост)
char не заданной длины
Только это называется указатель на char smile

Добавлено через 4 минуты и 43 секунды
Цитата(koren @  1.5.2010,  20:15 Найти цитируемый пост)
а можна как то сделать


можнА (правильно пишется "можнО") 

Цитата

Наречие как-то пишется через дефис


пиши грамотно, а то читать неприятно.

Автор: azesmcar 1.5.2010, 21:52
Цитата(Voldemar2004 @  1.5.2010,  21:41 Найти цитируемый пост)
char* Out;
strcpy(Out, (char*)stream.str().c_str());

 smile  smile  smile 

Автор: Voldemar2004 1.5.2010, 21:56
azesmcar, что такое ? smile

Автор: azesmcar 1.5.2010, 22:17
Цитата(Voldemar2004 @  1.5.2010,  21:56 Найти цитируемый пост)
azesmcar, что такое ? smile 

копирование данных в неинициализированый указатель smile 

Автор: Voldemar2004 1.5.2010, 22:34
Цитата(azesmcar @  1.5.2010,  23:17 Найти цитируемый пост)
копирование данных в неинициализированый указатель


Разве при копировании он не инициализуется ?

Так что ли:
Код

char* Out="";

Автор: koren 2.5.2010, 09:37
Как задать округление числа после точки на количество знаков?
просто cout.precision(2) округляет по количеству знаков всего числа, а не те после точки

И еще меняю - есть число 2300000
Как его преобразовать в 2.3е+06 и обратно (наверное через sprintf - но там плохо идёт округление)?

Моя цель организовать функцию QString::number(double num, char type, int precision) под консоль без Qt (char type - 'f', 'g', 'e'
)


Автор: azesmcar 2.5.2010, 10:19
Цитата(Voldemar2004 @  1.5.2010,  22:34 Найти цитируемый пост)
Разве при копировании он не инициализуется ?

нет, strcpy выделением памяти не занимается.

Цитата(Voldemar2004 @  1.5.2010,  22:34 Найти цитируемый пост)
char* Out="";

 smile 
Код

char* Out=new char[str.size() + 1];

Автор: Voldemar2004 2.5.2010, 10:42
azesmcar, виноват, всегда забываю этот момент  smile 

Это
Код

char* Out=new char[str.size() + 1];


тоже, что и это:

Код

char* Out=new char[strlen(stream.str().c_str())+1];

Автор: koren 2.5.2010, 11:06
Код

char buf[50];

    double h=precision_/10;
    sprintf(buf,"%hf",h,num); 


h=0.5 не работает 
как исправить?

Автор: koren 2.5.2010, 14:01
Код

string from_double_to_string(double num, char type_number, int precision_)
{
    char *buf;

    switch(type_number)
    {
        case 'f':
        {    
            unsigned long int N=fabs(num);
 
            int count_integer=0;
             //подсчет количества цифр
             while ( N != 0 )
             {
                  N /= 10;
                  count_integer++;
             }
            
            buf=new char[precision_+count_integer+3];
            sprintf(buf,"%*.*f",0,precision_,num);
            break;
                
        }
        case 'g':
        {
            buf=new char[precision_+6];
            sprintf(buf,"%*.*g",0,precision_,num);
            break;
        }
        case 'e':
        {
            unsigned long int N=fabs(num);
 
            int count_integer=0;
         //подсчет количества цифр
             while ( N != 0 )
             {
                  N /= 10;
                  count_integer++;
             }
            buf=new char[precision_+count_integer+6];
            sprintf(buf,"%*.*e",0,precision_,num);
            break;
        }
    }
    string temp(buf);
    delete buf;
    return temp;
}

Проверьте!!!

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