Programmieren lernen(C++)


Recommended Posts

Surft nur im ASB

XML und C# :love:

Da gibts viele schöne Möglichkeiten, und händische Schleifen gehören nicht unbedingt dazu.

Was du mit "einfache Tabelle" meinst ist mir leider nicht ganz klar, bitte erläutere das etwas genauer.

Ansonsten starte mal mit dem Artikel: http://support.microsoft.com/kb/307548

Dort wird beschrieben wie du mit dem XmlTextReader (using System.Xml) eine XML-Datei einliest, und mit den diversen Einträgen irgendwas machst - in dem Beispiel noch etwas sinnfrei aufbereitet, aber es ist eben ein Einsteigerartikel.

Ganz grob würde ich jetzt also sagen: du schaust dir an wie man mit DataTables umgeht (System.Data), wie man mit dem XmlTextReader arbeitet, und zu guter Letzt vielleicht noch ein bisschen XPath - dann ist das eine Sache von ein paar Zeilen.

Sag Bescheid, wenn du bei was speziellem mehr Hilfe brauchst!

hi step ;)

also ich habe es jetzt mal geschafft, es auszulesen:


		    List<CubeData> lstdata = (from c in element.Elements(ns + "Cube").Elements(ns + "Cube").Elements(ns + "Cube")
									  select new CubeData()
									  {
										  Currency = c.Attribute("currency").Value,
										  Rate = c.Attribute("rate").Value
									  }).ToList<CubeData>();

Das Liste ich dann mit GridView auf und es funktioniert. Jetzt würde ich gerne die Crossrates (zB für USD) auch noch dazu auflisten. Wie spreche ich dann die einzelnen Felder an? Sprich ich hab den EUR/USD Wert von 1,3037 und muss ihn durch die anderen Werte zB Yen, GBP dividieren. Bei mir haut das nicht ganz hin.

Oder muss das in eine komplett eigene Funktion rein?

Lg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

Okay - naja du hast jetzt deine ganzen Daten in einer List vom Typ CubeData (die offensichtlich mit den Properties Currency und Rate befüllt wird?).

Probier folgendes, jetzt ganz spezifisch für dein Problem mit den Crossrates für USD:

CubeData mydata = lstdata.FirstOrDefault(dat => dat.Currency == "USD");

if (mydata != null)

{

// check the rate for USD

// Datatype of rate? Double? String?

double myrate = mydata.Rate;

// Do something with your new rate ...

}

Hilft dir das weiter? Brauchst übrigens die System.Core als Referenz, aber die müsst eh dabei sein.

Du holst dir mit der LINQ Funktion dein CubeData-Objekt, das als "Currency" == "USD" hat. Wenn etwas gefunden wird, schaust du dir die Property namens "Rate" für das gefundene Objekt an, und speicherst sie als "myrate". Als nächstes kannst du also hergehen und deine Crossvalues für USD für alle Werte in der Liste berechnen lassen ...

Aber schaun wir mal ob das so weit alles hinhaut. ;)

bearbeitet von StepDown

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Surft nur im ASB

Okay - naja du hast jetzt deine ganzen Daten in einer List vom Typ CubeData (die offensichtlich mit den Properties Currency und Rate befüllt wird?).

Probier folgendes, jetzt ganz spezifisch für dein Problem mit den Crossrates für USD:

CubeData mydata = lstdata.FirstOrDefault(dat => dat.Currency == "USD");

if (mydata != null)

{

// check the rate for USD

// Datatype of rate? Double? String?

double myrate = mydata.Rate;

// Do something with your new rate ...

}

Hilft dir das weiter? Brauchst übrigens die System.Core als Referenz, aber die müsst eh dabei sein.

Du holst dir mit der LINQ Funktion dein CubeData-Objekt, das als "Currency" == "USD" hat. Wenn etwas gefunden wird, schaust du dir die Property namens "Rate" für das gefundene Objekt an, und speicherst sie als "myrate". Als nächstes kannst du also hergehen und deine Crossvalues für USD für alle Werte in der Liste berechnen lassen ...

Aber schaun wir mal ob das so weit alles hinhaut. ;)

Hi, schon mal vielen Dank! ;)

Also in mydata.Rate bzw. myrate ist jetzt genau der Wert vom USD enthalten? Habe ich das richtig verstanden? Wenn ich nun alles wie von mir oben Abfrage und danach dein mydata durchmache, wie kann ich dann C# sagen zB dass sie Currency/myrate berechnen soll und dann in die USD Spalte eintragen soll? .ToList<CubeData>() nimmt er mir irgendwie nicht? Kurz noch: Currency, Rate und USD sind alles Strings:

   public class CubeData
   {
    public string Currency { get; set; }
    public string Rate { get; set; }
    public string USD { get; set; }
   }

Also vereinfacht sollte es doch so aussehen: Rate/myrate sollte den USD Kurs für die jeweilige Währung rechts daneben ausgeben. Nur weiß ich nicht wie ich das realisieren soll? müsste ich dann nochmal die Rate mit from select abfragen?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

Hi, schon mal vielen Dank! ;)

Also in mydata.Rate bzw. myrate ist jetzt genau der Wert vom USD enthalten? Habe ich das richtig verstanden? Wenn ich nun alles wie von mir oben Abfrage und danach dein mydata durchmache, wie kann ich dann C# sagen zB dass sie Currency/myrate berechnen soll und dann in die USD Spalte eintragen soll? .ToList<CubeData>() nimmt er mir irgendwie nicht? Kurz noch: Currency, Rate und USD sind alles Strings:

Genau, mydata.Rate ist letzendlich der String "1,3073" aus der XML, eben dort wo "CURRENCY" gleich "USD" war.

Um deine lstdata jetzt noch um die USD-Spalte zu erweitern probier folgendes:

// myUSDrate sind die 1.3073 aus der obigen Funktion

Double myUSDrate_dbl;
Double.TryParse(myrate, out myUSDrate_dbl);


foreach (CubeData cd in lstdata)
{
Double cdrate_dbl;
Double.TryParse(cd.Rate, out cdrate_dbl);

cd.USD = (myUSDrate_dbl/cdrate_dbl).ToString();
}

So speicherst du die USD-Rate dividiert durch Currency-Rate im jeweiligen Objekt in deiner <List>. Sollte funktionieren ...?

(Oder hab ich mich beim Kurs-Umrechnen vertan? := )

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Surft nur im ASB

Genau, mydata.Rate ist letzendlich der String "1,3073" aus der XML, eben dort wo "CURRENCY" gleich "USD" war.

Um deine lstdata jetzt noch um die USD-Spalte zu erweitern probier folgendes:

// myUSDrate sind die 1.3073 aus der obigen Funktion

Double myUSDrate_dbl;
Double.TryParse(myrate, out myUSDrate_dbl);


foreach (CubeData cd in lstdata)
{
Double cdrate_dbl;
Double.TryParse(cd.Rate, out cdrate_dbl);

cd.USD = (myUSDrate_dbl/cdrate_dbl).ToString();
}

So speicherst du die USD-Rate dividiert durch Currency-Rate im jeweiligen Objekt in deiner <List>. Sollte funktionieren ...?

(Oder hab ich mich beim Kurs-Umrechnen vertan? := )

Es wird schon mal angezeigt. ;) Danke vielmals. Noch ein paar andere Fragen:

Weil ich es eben vorher oben bei string myrate = Convert.ToDouble gemacht habe. Ist das nicht so effektiv wie Double.TryParse?

Ist es immer sinnvoll vor den Variablen my* zu schreiben?

Wie kann ich mein WebService veröffentlichen? Sprich muss ich das ganze Projekt auf den Server hauen und dann etwas bestimmtest aufrufen?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

Weil ich es eben vorher oben bei string myrate = Convert.ToDouble gemacht habe. Ist das nicht so effektiv wie Double.TryParse?

Hmm ist Geschmackssache. Bei TryParse hast du den Vorteil, dass du bei einem "falschen" Wert nicht sofort eine Exception zurückgeballert kriegst. Quasi: er versucht eine Zahl zu parsen, wenn die Eingabe aber "Hallo" ist, wird er in die out-Variable keinen Wert schreiben. Damit lassen sich dann noch ein paar ganz nette Sachen machen, was bei der Aufgabe aber wohl zu viel des Guten wäre.

Wiegesagt, ist in meinen Augen eher Stilfrage als sonst was.

Ist es immer sinnvoll vor den Variablen my* zu schreiben?

Nein. :D

Auch hier eher Stilfrage usw, ich kenn deinen gesamten Code nicht, das mit dem "my" kommt (bei mir) vom Java-Programmieren.

Immer sinnvoll: intelligente, aussagekräftige Variablenbezeichnungen. Nicht zu lang, nicht zu kurz, ich habe mir bei konvertierten Variablen das "_dbl" (oder "_bool") angewöhnt.

Wie kann ich mein WebService veröffentlichen? Sprich muss ich das ganze Projekt auf den Server hauen und dann etwas bestimmtest aufrufen?

Das kommt wieder sehr stark darauf an, was genau dein Projekt ist (also ASP.NET Site, WebService, ...). Wenn du einen "echten" Server (also Win2008 Server oder Win2012 Server) zur Verfügung hast, ist das fein. Ich persönlich habe noch keinen sinnvollen Free Provider dafür gefunden, deswegen habe ich mir zuhause am Stand-PC (Win7) mein IIS konfiguriert. Ziemlich zeitaufwendige Sache, nicht ganz trivial, andererseits gibts gute Walkthroughs.

Grob gesprochen: du installierst auf deinem PC IIS 7, publishst dein C#-Projekt, konfigurierst im IIS die Website inkl. Applikationen für einen spezifischen Port, schaltest bei deinem Router Port-Forwarding für den spezifischen Port ein - dann kannst du (bzw: alle) von außen die Applikation verwenden.

http://msdn.microsoft.com/en-us/library/33487zw6(v=vs.80).aspx

Bei Problemen einfach melden. ;)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Surft nur im ASB

Leider muss ich mich noch einmal zu Wort melden und zwar wegen folgender zwei Dinge:

Bei der Ausgabe von den Cross Rates passt das Komma nicht, ich frage mich allerdings warum? zB ist 1,52... mir zeigt er aber 0,152.. an? Selbiges auch umkekehrt --> 1 USD sollten 0,655.. britische Pfund sein, bei mir wird aber 6,55 britische Pfund ausgegeben.

Und die zweite Frage wäre:

Ich wollte die Zahlen einfach mit Substring(0,6) zB kürzen, damit sie nicht so lange sind, da bekomme ich allerdings immer einen Error?

Lg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

Leider muss ich mich noch einmal zu Wort melden und zwar wegen folgender zwei Dinge:

Bei der Ausgabe von den Cross Rates passt das Komma nicht, ich frage mich allerdings warum? zB ist 1,52... mir zeigt er aber 0,152.. an? Selbiges auch umkekehrt --> 1 USD sollten 0,655.. britische Pfund sein, bei mir wird aber 6,55 britische Pfund ausgegeben.

Und die zweite Frage wäre:

Ich wollte die Zahlen einfach mit Substring(0,6) zB kürzen, damit sie nicht so lange sind, da bekomme ich allerdings immer einen Error?

Lg

Hmm zum Komma: komisch.

Da ist jetzt eine Ferndiagnose auch etwas schwierig. :=

Zum Kürzen: ich würde weniger mit Strings arbeiten. Das haut dann nämlich zb nimmer hin, wenn du eine Rate von 12.34567 hast. Konvertier dir die Rates als Double und verwende Math.Round(x, 5)

http://msdn.microsoft.com/en-us/library/system.math.round.aspx

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

AAAAlte Zeiten

versucht es mal mit CultureInfo.InvariantCulture

Hmm zum Komma: komisch.

Da ist jetzt eine Ferndiagnose auch etwas schwierig. :=

Zum Kürzen: ich würde weniger mit Strings arbeiten. Das haut dann nämlich zb nimmer hin, wenn du eine Rate von 12.34567 hast. Konvertier dir die Rates als Double und verwende Math.Round(x, 5)

http://msdn.microsof...math.round.aspx

er hat sicher einen fehler bei der division. schreib mal den normalen $ kurs vom € rein und lass es dann mal laufen ansonsten:

versucht es mal mit CultureInfo.InvariantCulture.

also double.Parse(myrate, Cultureinfo.InvariantCulture); statt tryParse

benötigt glaube ich System.Globalisation

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Captain Awesome

versucht es mal mit CultureInfo.InvariantCulture

er hat sicher einen fehler bei der division. schreib mal den normalen $ kurs vom € rein und lass es dann mal laufen ansonsten:

versucht es mal mit CultureInfo.InvariantCulture.

also double.Parse(myrate, Cultureinfo.InvariantCulture); statt tryParse

benötigt glaube ich System.Globalisation

Hmmjein, ist ein guter Einwand, und habe ich mir auch schon überlegt. Aber gefühlsmäßig würde er dann schon das Parsen nicht schaffen.

Aber einen Versuch ist es definitiv wert.

Zur Erklärung: CultureInfo.InvariantCulture gibt an, dass deine lokalen Spracheinstellungen (DE) ignoriert werden, und die Englischen verwendet werden. Statt 1,234 wird also 1.234 geparsed.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...


  • Folge uns auf Facebook

  • Partnerlinks

  • Unsere Sponsoren und Partnerseiten

  • Wer ist Online

    • Keine registrierten Benutzer online.