Parsen von Grad-Angaben

Ich möchte Grad.Angaben, also so: N 49° 43’ 56" E 07° 17’ 19"
in Dezimalgrad umrechnen, die Umrechnung ist kein Problem, aber das saubere Parsen dieses Eingabestrings.
Man findet davon 2 verschiedene Varianten, wie kann sicher und sauber die Zahlenwerte aus diesen Strings herausfischen?

N 49° 43’ 56" E 07° 17’ 19"

49° 43’ 56" N 07° 17’ 19" E

Kannst du davon ausgehen, dass die Trennungen immer identisch sind – also N oder E immer mit Space abgetrennt sind?
Dann wäre es m.E.nur nötig, einen Split(" ") vorzunehmen und jeweils 4 Array-Elemente anzuschauen: Entweder das erste oder letzte davon muss die Himmelsrichtung sein, die Koordinaten selbst folgen dann ja in einer Art, dass man sie via Integer.Parse einlesen kann.

Ja, so habe ich es gemacht, dachte, vielleicht gibt es noch eine bessere Lösung?!

Ich würde es so machen:

Gehe in einer Schleife über jedes Zeichen einzeln. Erkenne alle Ziffern. Solange eine Ziffer auf eine weitere folgt, sammle die zu einer Zahl zusammen. Alles übrige ignoriere, und füge die zuvor gesammelte Zahl zu einem Array hinzu. Schon hast du eine Sammlung von Zahlen. Wenn die Anzahl der Zahlen am Ende 6 ist, dann hast du vermutlich eine Grad-Angabe korrekt gescannt.

Code ginge etwa so (jetzt aus dem Kopf):

dim zahlen() as integer
dim aktZahl as string
dim input as string = "N 49° 43' 56"" E 07° 17' 19"""
for i as integer = 1 to input.len
  dim ch as string = input.mid(i, 1)
  if ch.asc >= 48 and ch.asc <= 57 then
    // eine ziffer
    aktZahl = aktZahl + ch
    continue
  end
  if ch.trim = "" then
    // space
  elseif ch = "°" then
    if (zahlen.Ubound mod 3) <> 0 then exit
  elseif ch = "'" then
    if (zahlen.Ubound mod 3) <> 1 then exit
  elseif ch = """" then
    if (zahlen.Ubound mod 3) <> 2 then exit
  elseif ch = "N" then
    if zahlen.Ubound > 2 then exit
  elseif ch = "E" then
    if zahlen.Ubound < 2 then exit
  else
    exit ' invalid char
  end
  if aktZahl <> "" then
    // wir hatten zuvor eine zahl gesammelt - die nun speichern
    zahlen.append aktZahl.val
    aktZahl = ""
  end
next
if zahlen.ubound = 5 then
   // zahlen() enthält das Resultat
end

Ja, das ist auf jeden Fall sicherer, danke

Wenn’s geht, markiere das doch mal als Antwort (nicht, da man dafr Punkte bekme wie bei SO :slight_smile:

Bestimmt gibt es ein geheimes Punktesystem :wink:

haben wir hier ein Geocacher? :wink:

Nein, Mineraliensammler…