Announcement

Collapse
No announcement yet.

Probleme bei Berechnungen mit Regional-Einstellungen von Windows

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme bei Berechnungen mit Regional-Einstellungen von Windows

    Hallo zusammen,

    ich habe ein Programmteil, was die Entfernung von Geokoordinaten berechnet. Da Geokoordinaten üblicherweise mit einem Dezimalpunkt dargestellt werden, manche Anwender jedoch versehentlich ein Komma dafür eingeben, wird das Komma intern vor der Berechnung durch einen Punkt ersetzt. Die Berechnung funktioniert auch tadellos, wenn aber in den Regional-Einstellungen des PC was anderes als Deutsch mit den Standard-Einstellungen ausgewählt ist (also ein anderer Dezimaltrenner) kommt verständlicherweise ein falsches Ergebnis raus(um Faktor 10 zu groß, also Komma um 2 Stellen nach rechts verschoben).
    Das Ergebnis hat demzufolge auch einen Punkt oder ein Komma als Dezimaltrenner, je nach Landeseinstellung und ist dementsprend korrekt oder zu groß.
    Kann mir vielleicht jemand auf die Sprünge helfen, wie unabhängig von den Regionaleinstellungen immer das gleiche Ergebnis rauskommt und trotzdem mit einem Punkt als programminterner Dezimaltrenner gerechnet werden kann?
    Die Berechnung selbst sieht übrigens so aus:
    Code:
    LatRAD1a = txtLAT1.Text.Replace(".", ",")
            LatRAD2a = txtLAT2.Text.Replace(".", ",")
            LonRAD1a = txtLON1.Text.Replace(".", ",")
            LonRAD2a = txtLON2.Text.Replace(".", ",")
    
            LatRAD1 = ((LatRAD1a / 180) * Math.PI)
            LonRAD1 = ((LonRAD1a / 180) * Math.PI)
            LatRAD2 = ((LatRAD2a / 180) * Math.PI)
            LonRAD2 = ((LonRAD2a / 180) * Math.PI)
    
    
            distance = Math.Acos(Math.Sin(LatRAD1) * Math.Sin(LatRAD2) + Math.Cos(LatRAD1) * Math.Cos(LatRAD2) * Math.Cos(LonRAD1 - LonRAD2)) * 6378.137
            tbDistance.Text = distance.ToString
    Viele Grüße!
    Zuletzt editiert von communi; 14.02.2012, 14:50.

  • #2
    Strings haben Punkt oder Komma. Zahlendatentypen kennen das nicht.

    Du hast also nur ein Problem richtig von string -> Zahlentyp umzuwandeln. Beim Umwandeln kann man (je nach benutzter Methode) eigentlich immer auch eine Überladung finder der man einen IFormatProvider mitgeben kann mit passender Einstellung des Dezimaltrennzeichens.

    Im einfachsten Fall wenn man einfach die InvariantCulture benutzt und sich kein eigenes NumberFormatInfo zusammenbasteln will wäre das zum Beispiel

    Code:
    LatRAD1 = Double.Parse(LatRAD1a, CultureInfo.InvariantCulture);

    Comment


    • #3
      Hallo Ralf,
      Funktioniert super, vielen Dank!!!

      Comment

      Working...
      X