Einzelnen Beitrag anzeigen

Piethan

Registriert seit: 2. Jun 2008
Ort: Köln
43 Beiträge
 
Delphi XE Architect
 
#20

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 3. Jun 2009, 16:45
Hallo Jürgen Thomas,

Danke für deine Prozedure. Ich habe diese für mein Programm in eine Funktion gepackt und mit
einen Rückgabetypen TAdresse = record versehen.


LG
Dirk

Delphi-Quellcode:
{
Diese Unit lehnt sich an den Beitrag von Jürgen Thomas an. Ich habe
diese Funktion eigentlich nur um einen eigenen Rückgabetypen
TAdresse erweitert und in eine eigene Unit gepackt. Daher
Danke an Jürgen Thomas.

Quelle : [url]http://www.delphipraxis.net/topic88990,0,asc,0.html[/url]

Dirk Piethan
03.06.2009
}



unit minitools;
interface

uses SysUtils;


type TAdresse = record
  STRASSE : STRING;
  HAUSNUMMER : INTEGER;
  ZUSATZ : STRING;
  POSTFACH : STRING;
end;

function Strasse_to_Details( sQuelle: string): TAdresse;

implementation
function Strasse_to_Details( sQuelle: string): TAdresse;
var
c0: char;
s0, s1, s2: string; i0, iNrLaenge: integer;
bNummer: boolean;
sStrasse: string;
iNr: integer;
sZusatz: string;
sPostfach: string;
begin
  sStrasse := '';
  sZusatz := '';
  sPostfach := '';
  iNr := 0;
  // um unterschiedliche Schreibweisen abzufangen
  s0 := AnsiLowerCase(sQuelle);
  // Postfach herausholen
  s1 := Copy( s0, 1, 8);
  s2 := Copy( s0, 1, 2);
  if ( (s1 = 'postfach') or (s2 = 'pf') ) then
  begin
    // Startposition der Nummer suchen
    i0 := 0;
    repeat
      Inc(i0);
    until s0[i0] in ['0'..'9'];
    // beim nächsten Befehl mache ich es mir einfach: max. 6 Ziffern + 2 Leerzeichen
    sPostfach := Copy(s0, i0, 8);
  end
  else begin
    // jetzt fehlt die Prüfung, ob überhaupt eine Hausnummer enthalten ist
    // oder in den o.g. Fällen 3 und 5 fehlt
    // endet die Quelle mit einer Ziffer?
    i0 := Length(s0);
    bNummer := s0[i0] in ['0'..'9'];
    // nein: Zusatz herausholen
    if (not bNummer) then
    begin
      repeat
        Dec(i0);
      until s0[i0] in ['0'..'9'];
      // bei der Länge des Zusatzes mache ich es mir einfach; aber es könnte auch
      // Situationen geben wie " a Wohnung 03-44", aber das hängt auch davon ab,
      // was die Ziel-Datenbank vorsieht
      // [/edit]muss vom Original genommen werden
      sZusatz := Copy(sQuelle, i0+1, 15);
    end;
    // jetzt steht i0 auf der letzten Ziffer der Hausnummer
    iNrLaenge := 0;
    repeat
      Dec(i0);
      Inc(iNrLaenge);
    until not (s0[i0] in ['0'..'9']);
    // StrToInt führt z.B. bei leerem String zu Exception
    try
      iNr := StrToInt( Copy(s0, i0+1, iNrLaenge));
    except
      iNr := 0;
    end;
    // Rest ist Straße
    // [/edit]muss vom Original genommen werden
    sStrasse := Copy(sQuelle,1,i0);
    Result.STRASSE:=sStrasse;
    Result.HAUSNUMMER:=iNr;
    Result.ZUSATZ:=sZusatz;
    Result.POSTFACH:=sPostfach;
  end;
end;
end.
Angehängte Dateien
Dateityp: pas minitools_866.pas (2,5 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat