Go Down

Topic: float und int zu String Variable? (Read 1 time) previous topic - next topic

Hallo, kann mir jemand sagen wie ich den Wert aus einer float Variable und einer int Variable in eine String-Variable zusammensetzen kann?

Danke

michael_x

Es ist hart für einen WebApps-Programmierer, aber String ist nichts für einen Arduino.

Den knappen RAM hast du mit char text[MAXSIZE]; besser im Griff;

Wenn du den Text nicht an ein Objekt übergibst, das print unterstützt { Serial.print(myfloat); Serial.print(" - "); Serial.println(myInt); } 
dann ist dtostrf und itoa , was du suchst.

Beide hängen eine binär 0 an den Text, die du (als poor man's concatenate) danach ausbügeln musst.

Code: [Select]
float myFloat=123.4567;
unsigned int myInt = 987;
//                      0123456789012345
static char buffer[] = "F: ###.## I: ###"; // 17 bytes sample text to overwrite

dtostrf(myFloat, 6, 2, &buffer[3]);
if (myInt < 1000)   // check if myInt fits !
   itoa(myInt,&buffer[13],10);   // 10 = decimal
buffer[9] = ' '; // concatenate both parts again

http://dereenigne.org/arduino/arduino-float-to-string

jurs


Hallo, kann mir jemand sagen wie ich den Wert aus einer float Variable und einer int Variable in eine String-Variable zusammensetzen kann?


In eine Stringvariable vom Typ "char-Array" oder in eine Stringvariable vom Typ "String-Objekt"?

Ich gehe mal vom Standard aus, also char-Array, da nützen Dir Funktionen aus der Standardbibliothek.

Integer in String:
itoa() ==> http://www.cplusplus.com/reference/cstdlib/itoa/

Float (unter Arduino ist "float" ein "double") in String:
dtostrf() ==> http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

Allgemeine Formatierung mit gemischten Variablen:
sprintf() ==> http://www.cplusplus.com/reference/cstdio/sprintf/

Leider funktioniert die sprintf-Funktion unter Arduino NICHT mit float/double Fließkommazahlen. Man könnte sich behelfen, eine Fließkommazahl erst mit dtostrf in ein char-Array zu packen und danach noch mit sprintf als String auszugeben.

  double f=3.14159;
  int i=3;
  char fstr[10];
  char myOutput[40];
  dtostrf(f, 5, 2, fstr);
  sprintf(myOutput,"Pi ist %s, also gerundet %d",fstr,i);
  Serial.println(myOutput);

Im allgemeinen solltest Du aber prüfen, ob Dein Programm überhaupt Fließkommazahlen benötigt. Der Verzicht auf Fließkommazahlen hält das Programm klein, da Integer-Arithmetik weniger großen Code erfordert als Fließkomma-Arithmetik.

Beispiel: Du benötigst Temperaturen auf Hundertstel Grad genau, dann kannst Du definieren
float T=23.51;
Oder Du rechnest alle Temperaturen im Programm gleich als Integer in Hundertstel Grad und definierst:
int T=2351;

Sowas ließe sich bei Bedarf mit sprintf() wesentlich eleganter mit zwei Nachkommazahlen ausgeben als eine tatsächliche Fließkommazahl, die von Arduino bei der sprintf()-Funktion nicht unterstützt wird.






Go Up