Float Formatierung

OP #4307765
Lesenswert?
• ▲
▼
Hallo
Habe ein Frage zum float Datentyp. Benutze ein Grafikdisplay und möchte 
dort mehrere Fliesskommazahlen darstellen. Leider haben die Werte 
unterschiedliche Dezimalstellen und können nicht gleich eingerückt 
werden. Wie mann die Nachkommastellen ändert, weiss ich. Gibt es auch 
eine Möglichkeit, die "Vorkommastellen" anzugeben?

U8glib.print(float(wert),3);


Beispiel wie es ist:
1.635
243.757

Beispiel wie es sein sollte:
001.635
243.757

Danke für die Unterstützung
Persönliche Seite #4308389
Lesenswert?
• ▲
▼
Jörg W. schrieb:
> Das snprintf() hilft dabei dagegen, dass bei einer (auch nur
> versehentlich) sehr großen Zahl irgendwo der bereitgestellte
> Speicherplatz überläuft.

Aber Vorsicht. Nicht alle Implementationen setzen in jedem Fall eine 
Terminierung (vgl Microsoft VC: _snprintf) auch, wenn sie es sollten. So 
kann man sich je nach System einen Folge-Fehler und eben wieder einen 
Puffer-Überlauf einhandeln.
Gast #4314017
Lesenswert?
• ▲
▼
Mach es von Hand. Mit ein wenig Mathematik wie es sprintf machen würde.
Du musst nur geschickt durch 10 teilen und mit cast nach int die 
Nachkommastellen
Entfernen. Bspw. 23,5 / 10 = 2,35 cast int = 2 jetzt jagst du das durch 
switch case
Und gibst ne '2' aus. Jetzt nimmst du die 2 wieder mal 10 und machst: 
23,5 - 20 und
Entfernst damit die höchste stelle. => 3,5 jetzt teilst du durch eine 
zehnerpotenz
Weniger also 10^0 = 1 cast nach int switch case und hast '3'. Dann 3 * 
10^0 abziehen
Und durch die nächste potenz teilen. 0,5 / 10^-1 = 5. Usw usf.
Gast #4314548
Lesenswert?
• ▲
▼
Bruno N. schrieb:
> Leider wird Float snprintf bei der Arduino IDE nicht unterstützt.
>
> Gibt es noch eine andere Möglichkeit?

Ja.

Guck in die Lernbetty hier im Forum und dort nach "conv.c". Da hast du 
sowohl Integer- als auch Float-Konvertierung in simplem C, sollte also 
problemlos verstehbar sein und auch auf nem AVR gehen.

W.S.
#4314936
Lesenswert?
• ▲
▼
Elec-lisper schrieb:
> switch case

Was "switch und case" hier sollen, weiß ich nicht, ich habe das mal so 
gemacht:
1
void printFloat(char* buff, float value) {
2
  int intval = (int) floor(value);
3
  int decval = (int) floor((value - (float) intval) * 1000.0);
4
  sprintf(buff, "%d.%03d", intval, decval);
5
}

snprintf() wäre natürlich besser, und statt "%d.%03d" wäre bei dir wohl 
"%03d.%03d" angebracht.

Ich weiß, da sind überflüssiger Code und Casts drin, das überlasse ich 
dem Optimierer, es zu entfernen. Ich will halt meinen eigenen Kram auch 
nach 2 Jahren noch von der Intention her verstehen :-)
Gast #4315096
Lesenswert?
• ▲
▼
Du kannst doch einfach anstelle von switch case ASCII 0 + x rechnen und 
bekommst auch die richtige Zahl raus.

Spart code size, ist schneller, da nur eine instruktion und einfach zu 
verstehen.

Wobei die paar Instruktionen, die man spart sind gegen float 
Berechnungen auch egal.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.