Char Wert - Punkt durch Komma ersetzen

Hallo,

als Anfänger bin ich etwas überfordert, was die Datenformate angeht.
Ich habe ein Messprogramm was mir bestimmt Gradzahlen ausgibt.

float grad = 0.0; Der Wertebereich ist 0.0 - 90.0

Diesen Wert wandle ich um in :

char Char[18]; dtostrf(grad, 3, 1, Char);

Dann gebe ich Char auf die SD-Karte aus :

dataFile.print(char);

Das Problem ist nun, das Excel, mit dem ich die Daten weiter verarbeite,
in Zahlen ein Komma erwartet und nicht einen Punkt.

Wie kann ich den Punkt in char durch ein Komma ersetzen bevor char auf
die SD-Karte geschrieben wird ?

also: xx.x in xx,x oder x.x in x,x

Das ist bestimmt nicht schwer, aber wie gesagt, mit den Datenformaten kenne ich mich als Laie nicht so aus. Für Hilfe bin ich sehr dankbar.

mfg

befe:
Dann gebe ich Char auf die SD-Karte aus :

dataFile.print(char);

Das glaube ich nicht. Du gibst Char aus, nicht char. Daran merkst Du evtl, dass es keine gute Idee ist, Variablen wie Datentypen zu benennen.

Ansonsten gehe über das Array und wandle '.' in ',' um:

for(byte i=0;i<sizeof(Char);i++) if (Char[i]=='.') Char[i]=',';

Gruß Tommy

(deleted)

Und wie gefällt das hier?

*(strchr(Char, '.')) = ',';

Geht natürlich nur, wenn sicher ein Punkt im String vorhanden ist.

Gruß Walter

Da würde ich zumindest den Nullpointer abfangen.

if (strchr(Char, '.')) *(strchr(Char, '.')) = ',';

Gruß Tommy

Sehr einverstanden.

Optimiert der Compiler den zweiten Aufruf von strchr() weg?
Gruß Walter

char Char[18] = "1.3,4.5,6.7";  
while(char * ptr = strchr(Char,'.')) *ptr = ',';
Serial.println(Char);

Ja, für mehrere '.'.
Für (höchstens) einen dann

if (char *ptr = strchr(Char, '.')) *ptr = ',';

Gruß Tommy

@combie: Schönes Beispiel für das Problem, das ein deutsches Excel dann bekommt ;).
Aber das kann man ja dann durch vorheriges Ersetzen der ',' mit ';' erledigen.

Ich glaube, hier können wir uns noch Stunden austoben.

@befe: Ist damit Dein Problem gelöst?

das Problem, das ein deutsches Excel

Das ist mir sowas von Wurscht!

char Char[18] = "1.3,4.5,6.7";  
for(char&c:Char)c=c=='.'?',':c;
Serial.println(Char);

Danke erstmal für die vielen Beispiele.

Ich werde mich morgen mal damit "auseinandersetzen" .. und testen.

mfg

@combie ... ich muß leider 1h warten, bevor Du von mir ein weiteres Karma erhalten darfst ... sorry :slight_smile: Denke Dir einfach '+1' - hast Es Dir auf jeden Fall für #6 verdient :slight_smile:

Das Gelump mit den Punkten statt Komma (CSV ... KOMMA (im Englischen halt mit C) seperated list) hatte ich auch schon ... blödes Zeug, Das!!
Denke, werde (wenn ich DAS Mal wieder angehe ... Data-Logger ...) auf ; und , gehen, damit (auch LibreOffice) Damit keine Probleme mehr hat.
Selbst eine Umwandlung (die blöden Punkte in Komma wandeln ... meine per SED ...) war nicht wirklich zielführend ...
Hatte dann aufgegeben :confused:
Vll. wird's ja zukünftig noch eine Neuauflage geben :slight_smile:

MfG

combie:

char Char[18] = "1.3,4.5,6.7";  

while(char * ptr = strchr(Char,'.')) *ptr = ',';
Serial.println(Char);

Sowas kann auch nur von Combie kommen. Chapeau!

Hallo,

mir fehlt bei allen die Beachtung vom Null Terminator.

Doc_Arduino:
mir fehlt bei allen die Beachtung vom Null Terminator.

Hier hasste einen '\0' geschenkt!
Den kannste solange betrachten, wie es dir gut tut.

Im Ernst:
strchr() beachtet deinen Terminator (und meinen auch)

for(char&c:Char)c=c=='.'?',':c;
Geht drüber weg, das macht aber nix.
Muss nur ein wenig sorgfältig sein, so dass man den '\0' nicht aus versehen ersetzt

Wird darum in vielen Fällen auch schneller sein als

while(char * ptr = strchr(Char,'.')) *ptr = ',';

Hallo,

ich las nur das eine Null terminierte Zeichenkette Bedingung ist, aber nicht das es "intern" Beachtung findet.
Dann ist ja alles klar.

Es ist Bedingung, weil es intern Verwendung findet.

Die Nullterminierung ist eher eine Konvention, als ein Sprachmerkmal.