www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kommastelle einfügen bei sprintf Befehl


Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy Leute,
ich hab mal eine frage.
Ich nutze die sprintf version um eine Integer Zahl in Dezimal zu wandeln 
und diese in einem Char Array abzulegen um diese dann in einem LCD 
anzeigen zu lassen.
Mein Code hierfür lautet


int i = 0x3168     //ist im richtigen Code natürlich ein Ergebnis
char Variable[16];

spintf(Variable,"Ergebnis: %d",i);
pts_lcd((char*) &Winkel[0], sizeof[Winkel)-1);

//Ausgabe auf LCD, Ergebnis: 12648


Das geht soweit alles ganz gut. Jetzt hab ich nur das Problem das die 2 
hinteren Stellen meiner Integer Zahl die Komastellen darstellen und ich 
einen Trennpunkt brauche, also auf dem Display folgendes kommt.

Ergebnis: 126.48

gibt es hierfür eine einfache Möglichkeit mit der sprintf Funktion oder 
wird das eine größere Aufgabe??

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man das nicht so lösen?
spintf(Variable,"Ergebnis: %d.%d",i/1,i%1);

Autor: michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergebnis zwischenspeichern
durch 100 teilen, dann wieder mit 100 multipliziern, dadurch werden die 
letzten beiden Werte zu 0.
Zieh von der größeren Zahl die kleinere ab und du hast deine 
Nachkommastellen, die wieder zwischenspeichern
dann teile wieder deine ursprüngliche zahl durch 100.

jetzt hast du in einer variablen die Zahlen vor dem Komma und in der 
andren die Hachkommastellen.

hoffe das war halbwegs verständlich

Autor: Florian M. (skywalker79)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten morgen,

du könntest mal versuchen

sprintf(Variable,"Ergebnis %3.2f",i);

das wären dann drei Stellen vorm Komma und zwei Stellen nach dem Komma.

Gruß Florian

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian M. wrote:
> sprintf(Variable,"Ergebnis %3.2f",i);
>
> das wären dann drei Stellen vorm Komma und zwei Stellen nach dem Komma.
Nö. Da die Variable i ein int ist, gibt es da keine 
Nachkommastellen, auch wenn Du sie als float ausgibst! Die Variante 
von Werner hingegen müsste funktionieren, wenn er anstatt "/1" und "%1" 
jeweils "/100" bzw. "%100" geschrieben hätte.

Abgesehen davon ist sprintf kein Befehl (Befehle gibt es in C nicht), 
sondern eine (Bibliotheks-) Funktion.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sprintf(Variable,"Ergebnis %3.2f",i);
>das wären dann drei Stellen vorm Komma und zwei Stellen nach dem Komma.
Nein, mindestens 3 Stellen, davon 2 nach dem Komma.

>Da die Variable i ein int ist, gibt es da keine
>Nachkommastellen, auch wenn Du sie als float ausgibst!
Dann müssen eben erst mal Nachkommastellen erzeugt werden:
sprintf(Variable,"Ergebnis %3.2f",(float)i/100);

Autor: Florian M. (skywalker79)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Kommastellen stimmt natürlich. da war ich vorhin etwas zu 
schnell mit dem Tippen.

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey danke für die schnelle Hilfe,
die Varante von Werner funktioniert wenn ich die Korrektur von Johannes 
M. einbaue.
Jetzt muss ich der kommastelle nur noch sagen das sie das minuszeichen 
weglässt dann funktioniert es 1A

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Kann man das nicht so lösen?
spintf(Variable,"Ergebnis: %d.%d",i/1,i%1); "

Wie wäre es mit
spintf(Variable,"Ergebnis: %d.%02d",i/100,i%100);

ansonsten kann es sein, dass 12.03 als 12.3 ausgegeben wird.

Wenn es auf Zeit oder Speicherplatz ankommt, gibt es wesentlich 
elegantere Methoden.

Autor: Jens Großmann (Firma: fa. Seuffer) (willi-helmchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf zeit und Speicher kommt es hierbei in erster Linie nicht an, da die 
Umrechnung und Ausgabe auf dem Display über kurz oder lang einer CanBus 
anbindung weichen muss.
Es dient im Moment lediglich der Kontrolle

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es auf Speicher und Rechenzeit nicht ankommt versuch es mal so:
int i = 0x3168     //ist im richtigen Code natürlich ein Ergebnis
char Variable[16];

float h;

h=i;

sprintf(Variable,"Ergebnis: %5.2f",h);
pts_lcd((char*) &Winkel[0], sizeof[Winkel)-1);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.