Hallo Leute!
Hab einen Webdienst der in einer Funktion nen double erwartet. Ich habe einen string der so aussieht("3982.9742"). Verwende ich die Funktion :
Convert.ToDouble(string);
ist der Punkt weg.
Ich könnte auch das machen:
Convert.ToDouble(string.Replace('.',','));
Dann sieht mein double wert so aus: "3982,9742".
Ich brauche diesen double wert aber unbedingt im us-Format, also mit Punkt.
Wie kann ich das machen? Hab schon alles probiert was ich gefunden habe.
MfG Ronnsen
Wer Wind sät wird Sturm ernten
Hallo joschika77,
du musst beim Parsen die Kultur angeben: CultureInfo.InvariantCulture
herbivore
hi!
danke erstmal für die schnelle Antwort, aber wie geschrieben hab ich schon alles probiert.
1.
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.InstalledUICulture;
System.Globalization.NumberFormatInfo ni = (System.Globalization.NumberFormatInfo) ci.NumberFormat.Clone();
ni.NumberDecimalSeparator = ".";
def.WriteLine(aEntry.getOurLatitudeDeparture());
def.WriteLine(double.Parse(aEntry.getOurLatitudeDeparture(),ni));
System.IFormatProvider fp = new System.Globalization.CultureInfo("en-US");
String sa = "1234.3256";
def.WriteLine(""+double.Parse(sa, fp));
MfG Ronnsen
Wer Wind sät wird Sturm ernten
Hallo joschika77,
hm, sehe nicht, wo du das oben schon geschrieben hast.
Liegt dein Problem vielleicht bei der Ausgabe? Dann musst du bei ToString das entsprechende Format angeben.
herbivore
hmmm... wenns nur die ausgabe wäre, wärs gut.
Das Problem ist das der double unbedingt diese Form haben muß. Ansonsten bekomme ich nix vom Webdienst zurück. Und ich bekomme nix zurück. Gebe ich feste Werte(double d = 1234.3445) kommt was zurück. Nun muß ich nur wissen wie ich meinen string in dieses Format bekomme.
MfG
Wer Wind sät wird Sturm ernten
Hallo joschika77,
naja, habe ich ja sowohl für den Einlese als auch für den Ausgabeteil beschrieben. Du hast alles, was du braucht.
herbivore
Ach so ein Beispiel von CultureInfo.InvariantCulture wäre nicht schlecht...
Wer Wind sät wird Sturm ernten
Hallo joschika77,
gibt es in der :rtfm: Doku.
herbivore
Ist das nicht zu gebrauchen? Ist doch auch sowas.
System.IFormatProvider fp = new System.Globalization.CultureInfo("en-US");
String sa = "1234.3256";
def.WriteLine(""+double.Parse(sa, fp));
Wer Wind sät wird Sturm ernten
Hallo joschika77,
naja, ich denke WriteLine ohne weitere Parameter wird mit der CurrentCulture formatieren und die ist vermutlich Deutsch und nicht Englisch.
Aber so schwer ist es doch nicht. Man muss doch nur an zwei Stellen (string -> double und double -> string) darauf achten, dass die jeweils gewünschte/passende Kultur verwendet wird.
herbivore
ja hallo erstmal...
das problem ist wohl, daß der webdienst-anbieter eine andere culture hat als joschika77.
ein formatieren beim aufrufen des webdienstes ist dank der webreferenzen kaum möglich.
wenn im wsdl als variablentyp "double" verlangt wird, kann man da leider keinen string von c# aus hinschicken, da microsoft so eine tolle typprüfung eingebaut hat.
der witz an der sache ist aber, daß in dem soap/xml-kram aber letztendlich doch strings stehen und das nicht-deutsche system dann mit dem komma nichts anfangen kann.
einzige mir bekannte lösungsmöglichkeit wäre den http-request komplett selbst zu schreiben, aber dann kann man auch beinahe gleich ganz auf .net verzichten...
Hallo LaBamba,
dann sollte doch aber SOAP ohnehin die invariante Kultur verwenden, oder? Jedenfalls denke ich, dass gilt: entweder SOAP verwendet die invariante Kultur oder SOAP bietet die Möglichkeit die Kultur zu beeinflussen.
herbivore
wunschdenken. 🙂
möglicherweise kann man im soap-request ja ein land übergeben. ansonsten könnte man eventuell die stub-klasse manuell ändern. kann dann aber nicht die norm sein.
Hallo LaBamba,
eben, SOAP muss über problemlos über Ländergrenzen hinweg arbeiten. Wenn nicht, hätten die Designer großen Mist gebaut und das glaube ich bei einem solchen Standard nicht. Also muss es ganz einfach gehen.
herbivore
Der Webservice liefert doch offenbar ein double zurück. Wo ist dann das Kultur-Problem? Doch nur, wenn man den Mist als String weiterverarbeitet. Selbst schuld...
Ne, du drehst es gerade um.. Er will einen double uebergeben. Weil SOAP nunmal auf XML basiert wird es sowieso als String uebergeben ("1234.567"). Dummerweise hat nach LaBamba die .Net SOAP Abstraktion die lustige Idee nur einen double zu akzeptieren und sich selbst um das formatieren zu kuemmern - und da scheint es zu klemmen..
Interessant zu lesen.. 😉
Pound for pound, plutonium is about as toxic as caffeine when eaten.
Wenn ich mir den geposteten Code anschaue:
def.WriteLine(aEntry.getOurLatitudeDeparture());
def.WriteLine(double.Parse(aEntry.getOurLatitudeDeparture(),ni));
dann wird da wohl ein String anstelle von double verwendet (zurückgegeben, nicht übergeben). Dann muss man natürlich wissen, in welcher Kultur der double codiert ist.
Mal abgesehen vom grottenschlechten Design: Wo ist da das Problem? Und welche der genannten Hilfestellungen führt nicht zum Ergebnis?
Wäre die Service-Schnittstellen korrekt entworfen (double anstelle von string als Rückgabewert), gäbe es alle diese Probleme nicht....
Aber das ist hier reines Orakel. Bisher gabs vom Fragesteller weder ausreichend Code (nämlich die Definition der besagten Funktionen, nicht nur die Verwendung...), kein WSDL, keine konkreten Fehlermeldungen, keine Rückmeldungen auf die Tipps sondern nur allgemeine Aussagen wie "hab schon alles ausprobiert....". Grund genug, jede weitere Hilfe einzustellen.....
Original von svenson
Wenn ich mir den geposteten Code anschaue:def.WriteLine(aEntry.getOurLatitudeDeparture()); def.WriteLine(double.Parse(aEntry.getOurLatitudeDeparture(),ni));
dann wird da wohl ein String anstelle von double verwendet (zurückgegeben, nicht übergeben). Dann muss man natürlich wissen, in welcher Kultur der double codiert ist.
hab ich anders verstanden. damit hat er sich den kram wohl zu kontrollzwecken ausgegeben.
Original von svenson
Mal abgesehen vom grottenschlechten Design: Wo ist da das Problem? Und welche der genannten Hilfestellungen führt nicht zum Ergebnis?
soll das ein scherz sein? jede hilfestellung führt nicht zu dem ergebnis.
DarKlajid hat das problem verstanden (wobei ich ja keine 100%igen aussagen treffen kann, da ich den kompletten problem-code nicht kenne).
Original von svenson
Wäre die Service-Schnittstellen korrekt entworfen (double anstelle von string als Rückgabewert), gäbe es alle diese Probleme nicht....
welcher rückgabewert? es geht doch darum, einen parameter richtig zu übergeben. der rückgabewert der funktion ist ja erstmal wohl egal.
Original von svenson
Aber das ist hier reines Orakel. Bisher gabs vom Fragesteller weder ausreichend Code (nämlich die Definition der besagten Funktionen, nicht nur die Verwendung...), kein WSDL,
woher soll er die funktionen haben, wenn die bei irgend nem webdienst liegen? wenn er sie hätte, hätte er sie bestimmt dahingehend geändert, daß kein double verwendet würde.
das wsdl könnte er sicher posten. da wären dann aber auch keine neuen erkenntnisse zu erwarten.
Original von svenson
keine konkreten Fehlermeldungen, keine Rückmeldungen auf die Tipps sondern nur allgemeine Aussagen wie "hab schon alles ausprobiert....".
fehlermeldung kam bestimmt keine, da der eigentliche fehler auf dem webserver auftreten wird.
Original von svenson
Grund genug, jede weitere Hilfe einzustellen.....
du hast ja auch schon so viel geholfen... 😁
Hallo LaBamba,
hm, du scheinst was in den falschen Hals bekommen zu haben. Die Kritik an svenson beiträgen kann ich in dieser harschen Form nicht nachvollziehen. Aber wir sollten wirklich erstmal das Orakeln einstellen, bis es konkrete Aussagen/Codeausschnitte von joschika77 gibt. Vielleicht hat joschika77 das Problem ja auch schon gelöst und wir verschwenden hier nur unsere Energie.
herbivore
Original von LaBamba
(wobei ich ja keine 100%igen aussagen treffen kann, da ich den kompletten problem-code nicht kenne).
Würde ungemein helfen, nicht wahr?
welcher rückgabewert? es geht doch darum, einen parameter richtig zu übergeben. der rückgabewert der funktion ist ja erstmal wohl egal.
Warum wird dann Code gepostet, der offenbar mit dem Problem gar nix zu tun hat? Ich sehe keinen einzigen Aufruf, dem ein Parameter übergeben wird, außer vielleicht double.Parse()
woher soll er die funktionen haben, wenn die bei irgend nem webdienst liegen?
das wsdl könnte er sicher posten. da wären dann aber auch keine neuen erkenntnisse zu erwarten.
Siehe oben. Du scheinst dir ja auch nicht sicher zu sein, was hier wirklich erwartet wird, ich zitiere mal dich selbst:
wenn im wsdl als variablentyp "double" verlangt wird, kann man da leider keinen string von c# aus hinschicken, da microsoft so eine tolle typprüfung eingebaut hat.
Tja, double oder string. Das ist hier die Frage. Aber bei double gibt es kein Problem, also muss es doch string sein und dann sind Herbis Hinweise auf die Kultur zielführend. Entweder Punkt oder Komma. Mehr Darstellungsformen sind mir nicht bekannt.
So hab bis jetzt probiert...kotz...
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.InvariantCulture;
System.Globalization.NumberFormatInfo ni = (System.Globalization.NumberFormatInfo) ci.NumberFormat.Clone();
ni.NumberDecimalSeparator = ".";
double d = double.Parse(stringTest, ni);
Wichtig ist die erste Zeile. Sonst gehts nicht...
Gibt dann aber auch Probleme mit DateTime konvertieren...
Dann müßte man dann:
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CreateSpecificCulture("de-DE");
System.Globalization.DateTimeFormatInfo di = (System.Globalization.DateTimeFormatInfo)ci.DateTimeFormat.Clone();
DateTime dt = new DateTime(2005, 3, 16);
dt.ToString(di);
MfG Ronnsen
Wer Wind sät wird Sturm ernten
Hallo joschika77,
also ich verstehe das Problem und den Aufwand nicht. Mit
double.Parse ("12.34", CultureInfo.InvariantCulture.NumberFormat);
bekomme ich die Zahl korrekt geparst, ganz ohne Nebenwirkungen.
Siehe auch double --> string für die umgekehrte Richtung.
herbivore
So hab's nochmal so wie Du geschrieben hast probiert...Cool..
So klappt's auch...und das viel einfacher...
MfG Ronnsen
Wer Wind sät wird Sturm ernten