Integer oder Long to String mit führenden Nullen

Hallo,

Ich habe zur Zeit ein Problem. Die Umwandlung von Long oder Int zu einem String bekomme ich ohne Probleme hin.

Jetzt suche ich eine Möglichkeit eine bestimmte Anzahl von führende Nullen zu erzeugen. Kann mir jemand von euch helfen?

void LCD_write_int(unsigned char X, unsigned char Y, int value, char invert){
  char buf[20];
  itoa(value,buf,10);
  LCD_write(X,Y,buf,invert);
}

Gruß Stefan

Das gabs schon mal

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295776250

;)

gloob: Jetzt suche ich eine Möglichkeit eine bestimmte Anzahl von führende Nullen zu erzeugen. Kann mir jemand von euch helfen?

void LCD_write_int(unsigned char X, unsigned char Y, int value, char invert){
  char buf[20];
  itoa(value,buf,10);
  LCD_write(X,Y,buf,invert);
}
}

Genug Platz im Flash?

void LCD_write_int(unsigned char X, unsigned char Y, int value, char invert){
  char buf[20];
  sprintf (buf, "%04d", value);   // int mit insgesamt 4 Stellen mit führenden Nullen ; sonst "%04d" ändern
  LCD_write(X,Y,buf,invert);
}

Wolfgang

Vielen Dank genau das und der Post vorher haben wir sehr geholfen. Gibt es noch die Möglichkeit die 4 Stellen als Parameter zu übergeben, um auch 2 oder 3 Stellen nur zu nutzen?

gloob: Vielen Dank genau das und der Post vorher haben wir sehr geholfen. Gibt es noch die Möglichkeit die 4 Stellen als Parameter zu übergeben, um auch 2 oder 3 Stellen nur zu nutzen?

void LCD_write_int(unsigned char X, unsigned char Y, int value, char invert, int anzStellen){
  char buf[20];
  char format[20];

  switch (anzStellen)
  {
    case 2: strcpy(format, "%02d");  // zwei Stellen, wenn anzStellen == 2
    break;
    case 3: strcpy(format, "%03d");  // drei Stellen, wenn anzStellen == 3
    break;
    default: strcpy(format, "%04d");  // vier Stellen, wenn anzStellen sonst was
   }

  sprintf (buf, format, value);
  LCD_write(X,Y,buf,invert);
}

Oder "format" sonst wie dynamisch zusammenbauen. "%02*l*d" verwenden, wenn value ein long statt int ist. Viele Infos zu allem (u.a. den Formatspezifikationen) im Internet unter Stichwort "printf" oder im C-Buch deines Vertrauens ;)

Vielen Dank für deine Hilfe. Auf die Idee mit den Case bin ich garnicht gekommen. Ist habs jetzt so in meinen Panorama Roboter eingebaut und es funktioniert alles so wie es soll.

Ein case statement für sowas??? Warum nicht gleich

...
char format[] = "%00d";
format[2] = '0'+anz_stellen;
...

[quote author=Udo Klein link=topic=58487.msg420696#msg420696 date=1302800896] Ein case statement für sowas??? Warum nicht gleich

...
char format = "%00d";
format[2] = '0'+anz_stellen;
...

[/quote] Hallo Udo,

es gibt viele Lösungen. Deswegen habe ich ja darunter auch schon als Alternative "dynamisch zusammenbauen" geschrieben.

Ansonsten sollte man in deinem Beispiel für format noch ein (eckiges) Klammerpaar oder einen Stern spendieren ;)

Gruß Wolfgang

Fipptehler [] ist jetzt korrigiert. Das kommt davon wenn man nicht in einer IDE sondern im Browser tippt ;)

[quote author=Udo Klein link=topic=58487.msg420775#msg420775 date=1302806082] Fipptehler [] ist jetzt korrigiert. Das kommt davon wenn man nicht in einer IDE sondern im Browser tippt ;) [/quote] Tja, der Mensch ist halt verwöhnt. Das waren noch Zeiten, als man mit vi statt Visual Studio seine Programme geschrieben hat...

vi? sed rules ;)

[quote author=Udo Klein link=topic=58487.msg420696#msg420696 date=1302800896] Ein case statement für sowas??? Warum nicht gleich

...
char format[] = "%00d";
format[2] = '0'+anz_stellen;
...

[/quote]

So am Rande: Ich frage mich, warum der Compiler hier nicht mal 'ne leise Warnung abgibt, dass bei der Zuweisung von '0'+anz_stellen (int!) in einen char irgendwas verlorengehen könnte? Auch nicht im AVR-Studio 4, wo ich -Wall gesetzt habe.

Wieso sollte er? Das gehört so. char ist auch nur ein integer Typ. Wenn Du das wolltest hätte der Compiler viel zu warnen.

Wenn Du bei sowas richtig gewarnt werden willst, dann sollte der Compiler besser die Semantik kennen, d.h. er braucht sowas wie ein Dictionary: http://de.wikipedia.org/wiki/Data_Dictionary. Wenn Du nur technische Typen hast, dann kann Dir der Compiler so oder so nicht viel helfen.

[quote author=Udo Klein link=topic=58487.msg420814#msg420814 date=1302808158] Wieso sollte er? Das gehört so. char ist auch nur ein integer Typ. Wenn Du das wolltest hätte der Compiler viel zu warnen. [/quote] na, mal angenommen in anz_stellen stünde irgendwas über 255 drin. Dann würde es im char (format[2]) doch ungemütlich eng. Visual Studio sagt in einem solchen Fall zur Sicherheit "warning C4244: '=' : conversion from 'int' to 'char', possible loss of data".

Eng? Nach 255 kommt eben wieder 0;)

Hey Jungs vielen Dank für eure Hilfe,

Ich hätte nicht gedacht, dass ich mit einer solchen simplen Frage ein so großes Aufkommen verursachen kann. Ich hab jetzt die Version von Udo genommen da sie um einiges universeller ist als die Case Anwendung XD.