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


Автор: Wowa 16.11.2004, 21:23
Что является в С++ аналогом функции DoubleToStr ?
Нужно строку со значением Double присоединить к Стрингу smile

Автор: dargaard 16.11.2004, 21:29
int main() {
double f=2.3;
char c[20];

sprintf(c,"%f",f);
printf("%s\n",c);
}

или
sprintf(c,"%g",f);
чтоб убрать ненужные нули.

Автор: Wowa 16.11.2004, 21:35
прокатит ли?

Код

string test() {
double f = 2.3;
string c ='lalala';

return ( c + sprintf(c,"%f",f) );
}


Если нет, то как мне привести код к такой форме? smile

Автор: dargaard 16.11.2004, 21:41
Код

#include <stdio.h>
#include <iostream>
#include <string>
                                                                               
using namespace std;
string test();
int main() {
   string p;
   p=test();
   cout<<p<<endl;
}
                                                                               
string test() {
   double f=2.3;
   char c[20];
   string mystring="lalala";
   sprintf(c,"%g",f);
                                                                               
   return mystring+c;
}


Автор: shedon 16.11.2004, 21:42
Admin
А что ты хоочешь сделать ?

Код

int main()
{
       double f=3.14;
       char s[255] = "lalal";
       sprintf(s+strlen(s), "%f", f);
       printf("%s", s);
       return 1;
}

Автор: Wowa 16.11.2004, 22:36
shedon
Зачем в твоем варианте?
Цитата(shedon @ 16.11.2004, 19:42)
printf("%s", s);


Добавлено @ 22:38
Ладно, чтобы было понятнее, вот полный текст функции:

Код

string beAusgezahltenBetrag (int Zinssatz, int Laufzeit, int Betrag, int Monat=0, int VerzBetragAusVormonat=0)
{
 Monat++;
 return (Monat == Laufzeit) ? "Ausgezahlte Betrag" + DoubleToStr( (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) ):beAusgezahltenBetrag(Zinssatz, Laufzeit, Betrag, Monat, (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) );
 
 
}


Мне надо, чтобы так все и осталось в одну строку, хотя это не является в принципе обязательным. Но выполнять присваивание какой-то переменной значения - запрещено. Т.к. это не С++, а FC++ (функциональное программирование).

Автор: shedon 16.11.2004, 22:38
просто вывод результат для наглядности, можешь убрать если не нравится smile

Автор: Wowa 16.11.2004, 22:56
еще мысли ? smile

Автор: NiJazz 16.11.2004, 23:00
Если говорить о программировании под Win32 (Unicode), то советую пользоваться таким способом форматирования строки:
Код

#include <windows.h>
#include <iostream.h>

void main()
{
LPTSTR  lpStr = (LPTSTR)LocalAlloc(LMEM_FIXED, 128);
DWORD  dwDigit = 123;

wsprintf(lpStr, "My number equals: %d", dwDigit);
cout << lpStr << endl;

LocalFree(lpStr);
}

Только затрудняюсь ответить, как работать с double. Может, кто-нибудь знает?
Добавлено @ 23:06
А чтобы сцепить две строки, используй
Код

LPTSTR StrCat(LPTSTR lpStr1, LPCTSTR lpStr2);

lpStr2 присоединяется к lpStr1

Хотя можно и так:
Код

wsprintf(StrOut, "%s %s", str1, str2);
В strout буду идти две стооки через пробел.

Автор: sergejzr 16.11.2004, 23:11
Вот это работать будет smile
может красивей получится написать smile
Код

string beAusgezahltenBetrag (int Zinssatz, int Laufzeit, int Betrag, int Monat, int VerzBetragAusVormonat)
{
Monat++;
char buf[256];//сколько надо

if(Monat == Laufzeit)
{
               sprintf(buf,"%d",(VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1));
               return string("Ausgezahlte Betrag") +buf;

}
return beAusgezahltenBetrag(Zinssatz, Laufzeit, Betrag, Monat, (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) );
}

Добавлено @ 23:18
Вот, extras вдогонку smile

Наверняка пригодится smile

Код

string DoubleToStr(double d)
{
char buf[256];//сколько надо
sprintf(buf,"%d",d);
return string(buf);
}

string IntToStr(int i)
{
char buf[256];//сколько надо
sprintf(buf,"%i",i);
return string(buf);
}

Тогда можно будет с твоей исходной функцией работать не меняя её smile

Автор: sergejzr 16.11.2004, 23:25
Правда с этими буквами %d и %i я не уверен. Может быть %f и %l.

Эти спецификации типов в функциях я уже подзабыл smile

Автор: Wowa 17.11.2004, 01:30
sergej.z
IF, ELSE, WHILE, FOR и прямое объявление переменных нельзя использовать в FC++

Автор: sergejzr 17.11.2004, 01:38
Не знаю FC++...
А что, значит функции DoubleToStr и IntToStr, которые я написал тоже не пойдут?
потому что там массив обьявляется?

Автор: dargaard 17.11.2004, 01:42
а ftoa есть в фс++?
если да то
Код


string beAusgezahltenBetrag (int Zinssatz, int Laufzeit, int Betrag, int Monat=0, int VerzBetragAusVormonat=0)
{
 Monat++;
return (Monat == Laufzeit) ? "Ausgezahlte Betrag" + ftoa( (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) ):beAusgezahltenBetrag(Zinssatz, Laufzeit, Betrag, Monat, (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) );
   
 
}


Автор: sergejzr 17.11.2004, 01:48
Только тогда наверное
Код

return (Monat == Laufzeit) ? string("Ausgezahlte Betrag") + ftoa( (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) ):beAusgezahltenBetrag(Zinssatz, Laufzeit, Betrag, Monat, (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) );

Автор: Wowa 17.11.2004, 01:49
Цитата(sergej @ 16.11.2004, 23:38)
А что, значит функции DoubleToStr и IntToStr, которые я написал тоже не пойдут?
потому что там массив обьявляется?

Думаю подойдут
Добавлено @ 01:50
Цитата(dargaard @ 16.11.2004, 23:42)
а ftoa есть в фс++?

не знаю, но наверняка. А можно краткое описание ftoa ?

Автор: dargaard 17.11.2004, 01:58
Описания у меня нету. Просто думал что может есть что нить по аналогии с itoa
(перевод инта в строку).

char * itoa ( int value, char * buffer, int radix );

Автор: Wowa 17.11.2004, 02:00
Цитата
`ftoa' undeclared (first use this function)


Это обычный компиллер g++
Добавлено @ 02:03
Еще так ругается:
Цитата
default argument given for parameter 5 of `std::string
  beAusgezahltenBetrag(int, int, int, int = 0, int = 0)'

Автор: sergejzr 17.11.2004, 02:03
Цитата(Admin @ 17.11.2004, 00:49)
Думаю подойдут

Ну тогда юзай смело smile

А что за зверь такой FC++?

Автор: Wowa 17.11.2004, 02:05
Цитата(sergej @ 17.11.2004, 00:03)
А что за зверь такой FC++?

Если бы я знал smile http://forum.vingrad.ru/index.php?showtopic=34071&hl=fc\
Я так понял, отличается только отсутствием некоторых операторов.

Автор: dargaard 17.11.2004, 02:36
вот попробовал свою фтоа написать используя условия фс++.
Осталось только заменить if-ы на ?: оператор
Долго не тестил но вроде работает. (надеюсь.) но енто - изврат полнейшийsmile

Код

string ftoa(double f,int k,int signs) {
                                                                                   
   f-=k;
   f*=10;
   signs++;
                                                                                   
   if (signs==7) {return string("0"); }
   else if (signs==1) {
       return string(itoa(k))+string(".")+string(ftoa(f,(int)(f),signs));
   } else return string(itoa(k))+string(ftoa(f,(int)(f),signs));
}

string myftoa(double f) {
   return ftoa(f,(int)(f),0);
}

...
string a = myftoa(10.4523211);


Автор: Wowa 17.11.2004, 02:53
Цитата(dargaard @ 17.11.2004, 00:36)
но енто - изврат полнейший

однозначно, блин.. А что же такое? Функцию DoubleToString мы уже написали, но неужели в С++ нет простой функции присоединения строки? В PHP это делается так: a.b
Точно служет символом присоединения.

В Делфи, насколько я помню, есть функция DoubleToString и строки можно через + пристыковывать одна к другой.

Автор: dargaard 17.11.2004, 05:51
Цитата
, но неужели в С++ нет простой функции присоединения строки?

Если имеем char * то для стыковки используем strcat(строка,строка_которую_пресоединить).
Если строка типа string то работает +

Автор: NiJazz 17.11.2004, 10:11
Admin
Что за FC++?

Автор: sergejzr 17.11.2004, 12:11
Цитата(Admin @ 17.11.2004, 01:53)
но неужели в С++ нет простой функции присоединения строки?

Хочешь, можешь оператор переложить smile
Си++ ведь сам прогер под себя настраивает.
В начале считай что Си перед тобой. А там строка ведь не существует как тип..

Только конечно с операторами поостророжней надо smile

Автор: Wowa 17.11.2004, 12:26
Как избавится от этих ошибок?
Цитата(Admin @ 17.11.2004, 00:00)
default argument given for parameter 5 of `std::string
  beAusgezahltenBetrag(int, int, int, int = 0, int = 0)'


Автор: sergejzr 17.11.2004, 12:33
Довольно странная ошибка. Он чего функцию за конструктор считает....

На всякий случай:
если функция задекларирована со значениями по умолчанию,
Код
string beAusgezahltenBetrag(int, int, int, int = 0, int = 0);


то в имплементации писать int=0 второй раз нельзя.
Т.е пишешь просто
Код
string beAusgezahltenBetrag(int a, int b, int c, int d, int e)
{
//имплементация
}


Где взять комплиер на FC++? smile

Автор: Wowa 17.11.2004, 12:39
Цитата(sergej @ 17.11.2004, 10:33)
Где взять комплиер на FC++?

Такого нет, насколько я знаю. Я использую просто обычный g++ 3.2.2. версия.
Добавлено @ 12:39
Цитата(sergej @ 17.11.2004, 10:33)
На всякий случай:

ты прав smile

Автор: Wowa 17.11.2004, 13:31
Цитата(sergej @ 16.11.2004, 21:25)
Правда с этими буквами %d и %i я не уверен. Может быть %f и %l.

Да, да, Действительно правильнее так:

Код

string DoubleToStr(double d)
{
char buf[256];//сколько надо
sprintf(buf,"%f",d);
return string(buf);
}


иначе ругается:
Цитата
0_3.cpp: In function `std::string DoubleToStr(double)':
0_3.cpp:70: warning: int format, double arg (arg 3)



В общем, можно сказать УРА и всем спасибо! smile Теперь всё без варнунгов smile
Добавлено @ 13:33
а функция такой вид теперь имеет: Собственно, почти как и было, только функцию DoubleToStr мы сами дописали.
Код

string beAusgezahltenBetrag (int Zinssatz, int Laufzeit, int Betrag, int Monat, int VerzBetragAusVormonat)
{
 Monat++;
 return (Monat == Laufzeit) ? "Ausgezahlte Betrag" + DoubleToStr( (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) ):beAusgezahltenBetrag(Zinssatz, Laufzeit, Betrag, Monat, (VerzBetragAusVormonat+Betrag)*(Zinssatz/12/100+1) );  
}

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