Betrags-Vereinheitlichung (internationales Komma-Problem)
-
... in der tat - phantastisch.
das strrchr hab ich auch ganz überlesen.was sagst du denn zu meiner lösung?
da werd ich nicht weit kommen, oder?zum verständnis für mich,
die while-schleife versteh ich noch nicht ganz.
ist *(ptls+1) der zeiger auf den zeiger ein zeichen weiter? (reimt sich sogar)while(*ptls && *(ptls+1)) {
*ptls=*(ptls+1);
ptls++;
}
if(*ptls)
*ptls=0;
-
enterbreak schrieb:
... in der tat - phantastisch.
Und man musste nur 1 Zeichen ändern
was sagst du denn zu meiner lösung?
da werd ich nicht weit kommen, oder?Dein Algorithmus ist nicht flexibel genug. Du suchst ja nach nach einem Komma, gefolgt von 3 beliebigen Zeichen und danach einem Punkt.
Damit wirst du jedoch nicht so einen Wert verarbeiten können:
EUR 6.543,21
Abgesehen davon stimmt deine Semantik nicht. mit *p+4 bekommst du NICHT den Wert 4 Stellen weiter sondern den Wert, auf den p zeigt um 4 erhöht (der Dereferenzierungsoperator bindet stärker).zum verständnis für mich,
die while-schleife versteh ich noch nicht ganz.
ist *(ptls+1) der zeiger auf den zeiger ein zeichen weiter? (reimt sich sogar)Fast. Das ist der Wert an der nächsten Stelle. ptls+1 ist die nächste Adresse. Durch das * wird diese Adressse dereferenziert.
Diese Schleife:while(*ptls && *(ptls+1)) { *ptls=*(ptls+1); ptls++; }
macht also nichts anderes, als alle Werte um 1 Stelle nach vorne zu rücken.
Nach Beendigung der Schleife zeigt der Zeiger auf das letzte Zeichen (das wir nicht mehr brauchen, da es gerade eine Stelle nach vorne kopiert wurde). Deshalb überschreiben wir es mit der bin. 0 und terminieren damit den string.
if(*ptls) *ptls=0;
-
Da ich gerade gesehen habe, dass du die Klasse string benutzt, hab ich noch schnell ne C++ Variante geschrieben. Die Funktion sollte (das Testen überlasse ich wieder dir;-) mit allen Schreibweisen zurecht kommen:
#include <iostream> #include <string> #include <iomanip> using namespace std; double s2d(string s) { int c=0,p=0; for(string::iterator it = s.begin(); it != s.end(); it++) { if(*it == ',') { *it = '.'; c++; } else if(*it == '.') p++; } if(c > 1 || p > 1) { string::size_type end; if(!c || !p) end = s.length() -1; else end = s.rfind("."); for(string::size_type ip = 0; ip < end; ) { if(s[ip] == '.') { s.erase(ip,1); end--; } else ip++; } } return atof(s.c_str()); } int main() { string s[] = { "1,23", "1.23", "1,234,567", "1,234,567.89", "1.234.567", "1.234.567,89", "123" , "123.4567", "-234,555,666.544"}; cout.precision(16); for(int i=0; i < sizeof(s)/sizeof(string); i++) cout << setw(16) << s[i] << " -> " << s2d(s[i]) << endl; return 0; }
-
@interpreter...
wenn ich da sowas gepostet hätte unter www.fun-soft.de was die kommas durch punkte ersetzt dann hätte mir der virtual eins mit der keule übergezogen nachdem er gesagt hätte man soll setlocale verwenden
-
@windalf:
wat is nu schon wieder "setlocale "??@interpreter:
genial - super!
das posting sollte mal von 'nem OP in die FAQ geschoben werden!
-
Windalf schrieb:
@interpreter...
wenn ich da sowas gepostet hätte unter www.fun-soft.de was die kommas durch punkte ersetzt dann hätte mir der virtual eins mit der keule übergezogen nachdem er gesagt hätte man soll setlocale verwendenIs mir schon klar. ich hab setlocale zwar noch nie benutzt aber glaube nicht, dass das gereicht hätte. Im Grunde setzt man damit ja nur Einstellungen wie Tausendertrennzeichen etc. Der OP wollte jedoch das Umwandeln von verschiedenen Formaten "x,xxx.xx", "x.xxx,xx" usw.
Außerdem scheint es ihm ja offensichtlich doch geholfen zu habenZu setlocale:
http://home.fhtw-berlin.de/~junghans/cref/MAN/setlocale.htm
-
#include <stdlib.h> #include <locale.h> int main() { setlocale(LC_NUMERIC, "German"); printf("%f\n", atof("3,14")); }
bevor mich wieder alle kielholen... ja der zweite parameter ist nicht standardisiert...
-
...setlocale is dann wohl eher linux-spezifisch und nicht windoofs
hat auf jeden fall geholfen - läuft auch schon - die c++ variante scheint mir irgendwie schneller in der Verarbeitung zu sein (vielleicht auch nur einbildung?)
danke auf jeden fall - > und ab damit in die FAQs sag ich
-
..
-
Windalf schrieb:
#include <stdlib.h> #include <locale.h> int main() { setlocale(LC_NUMERIC, "German"); printf("%f\n", atof("3,14")); }
bevor mich wieder alle kielholen... ja der zweite parameter ist nicht standardisiert...
Wie ich in meinem letzten Posting bereits sagte, würde ihm das aber nicht reichen...
-
@interpreter...
ja muss zu meienr schande gestehen ich hab den post nicht richtig gelesen
-
Windalf schrieb:
@interpreter...
ja muss zu meienr schande gestehen ich hab den post nicht richtig gelesenDu Schwein!1