Fließkommazahl aus String extrahieren
-
Hallo,
Gegeben sei ein String in folgendem Format:
"ABC f.fdd"
Dabei ist "f.f" eine Fließkommazahl, die 1 bis 3 Vorkommastellen haben kann und genau eine Nachkommastelle hat. "dd" sind zwei Ziffern, die zwar ohne Leerzeichen direkt auf die Fließkommazahl folgen, aber nicht zu ihr dazugehören.
Wie würdet ihr die Fliesskommazahl aus dem String extrahieren?
Beispiele:
"ABC 0.123" -> 0.1 "ABC 12.345" -> 12.3 "ABC 123.456" -> 123.4
Gruß
Michael
-
Der String muss zunächst eine gültige Fliesskommazahl wie "0.123" beinhalten. Dann setzt man die C-Funktion atof() ein und erhält 0.123 als Fliesskommazahl. Willst man die Nachkommastellen noch runden, ist eine Funktion round() erforderlich. Diese bietet entweder der Compiler oder man kann sie von meiner Homepage http://berniebutt.npage.de herunter laden.
Das mit "ABC 123.456" als String mit dem Ergebnis 123.4 habe ich nicht verstanden. Noch weitere Fragen?
-
@berniebutt: Da der Fragesteller im C++/CLI Forum gepostet hat, poste bitte auch ein Lösung mit C++/CLI. Falls Du vermutest, dass er sich im Forum geirrt hat, sprich ihn darauf an.
-
Hallo,
theta schrieb:
@berniebutt: Da der Fragesteller im C++/CLI Forum gepostet hat, poste bitte auch ein Lösung mit C++/CLI. Falls Du vermutest, dass er sich im Forum geirrt hat, sprich ihn darauf an.
Die Frage steht schon im richtigen Forum, es geht um C++/CLI.
> Das mit "ABC 123.456" als String mit dem Ergebnis 123.4 habe ich nicht verstanden.
Ich meine eigentlich, es bereits verständlich erklärt zu haben. Die Fließkommazahl hat genau _eine_ Nachkommastelle, und das was dahinter steht gehört nicht mehr zu der Fließkommazahl dazu -- auch wenn es dort an einem Leerzeichen mangelt. Ich will die Zahl nicht runden.
Gruß
Michael
-
Das einfachste wird dann direkt per nativer C-Funktion sscanf sein:
double f; int d; sscanf(c_str, "%.1f%d", &f, &d);
Edit: ok, der 1. Parameter (auszuwertende String) fehlt selbstverständlich...
-
Double::TryParse oder Double::Parse
Wenn Du definitiv immer einen Punkt als Trenner hast, würde ich immer System::Globalization::CultureInfo::InvariantCulture mit übergeben, damit es richtig umgewnadelt wird.
-
Th69 schrieb:
Das einfachste wird dann direkt per nativer C-Funktion sscanf sein:
double f; int d; sscanf("%.1f%d", &f, &d);
Und bei native C hakt es dann aus. Hat doch jeder verfügbar. Meint aber, es nicht mehr zu brauchen. Ist Pippikram! Entweder nimmt man vorhandene Standardfunktionen oder schreibt das selbst. Wo ist das Problem?
Grüsse aus der Steinzeit der Programmierung. daddeldu! :p
-
Hallo Jochen,
Jochen Kalmbach schrieb:
Double::TryParse oder Double::Parse
Wenn Du definitiv immer einen Punkt als Trenner hast, würde ich immer System::Globalization::CultureInfo::InvariantCulture mit übergeben, damit es richtig umgewnadelt wird.
Ich kriege es mit Double::Parse einfach nicht hin. Was muss ich als Argument übergeben, wenn der String eine Fließkommazahl mit genau einer Nachkommastelle enthält, unmittelbar gefolgt von weiteren Ziffern die nicht dazugehören?
Gruß
Michael
-
Du musst den String *vorher* aufteilen! Und erst dann den Zalhen-String übergeben...
Ermittle z.B. den Punkt mit "pos = IndexOf('.')" und dann hole den Substring raus mit "z = Substring(0, pos+1)"; und dann kannst Du "z" dem Double::Parse übergeben...
-
Th69 schrieb:
Das einfachste wird dann direkt per nativer C-Funktion sscanf sein:
double f; int d; sscanf("%.1f%d", &f, &d);
So einfach scheint die "native C-Funktion" in ihrer Bedienung aber nicht zu sein, 2 Fehler in einer Zeile ist schon ziemlich üppig.
-
Hallo Jochen,
Jochen Kalmbach schrieb:
Du musst den String *vorher* aufteilen! Und erst dann den Zalhen-String übergeben...
Ermittle z.B. den Punkt mit "pos = IndexOf('.')" und dann hole den Substring raus mit "z = Substring(0, pos+1)"; und dann kannst Du "z" dem Double::Parse übergeben...
Ach so, dann ist mir das jetzt klar. Danke !
Gruß
Michael