Thema: Delphi Handynummer zu ordnen

Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#28

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 09:22
Hallo,

ganz solange wie Du hab' ich gestern nicht mehr an dem Problem gesessen, dafür gibt es jetzt eine Unit PhoneNumber, die auf Deiner Entwicklung basiert.

Dort, wo meiner Meinung nach "Fehler" waren, habe ich die entsprechenden Zeilen auskommentiert und mit // --> versehen, die korrigierte Zeile befindet sich direkt darunter.
Ein Problem, dass ich nicht habe lösen können (aber nicht für unlösbar halte): Wenn der AreaCode kürzer ist als der aus der zu prüfenden Nummer, so scheitert die Prüfung. Habe noch nicht so ganz begriffen, woran das liegt.

Der Funktion EqualPhoneNumber habe ich noch einen weiteren Parameter gegönnt, ihr wird jetzt zusätzlich der NationalExitCode übergeben, so dass man auf die "hart verdrahtete '00'" verzichten kann und von "außen" den NationalExitCode mit übergeben kann, das erleitert das Testen mit anderen NationalExitCodes.

Und nun die Unit:
Delphi-Quellcode:
unit PhoneNumber;

interface

Function EqualPhoneNumber(KnownNumber : String;
                          UnknownNumber : String;
                          InternExitCode : String;
                          AreaCode : String;
                          CountryCode : String;
                          NationalExitCode : String) : Boolean;

implementation

Uses Math, SysUtils, StrUtils, Dialogs;

// Diese Funktion Vergleicht 2 Telefonnummern, KnownNumber und UnknownNumber,
// und erkennt die Nummer auch wenn Amt(InternExitcode),
// Ortsvorwahl/Handynetzvorwahl(Areacode) oder Landesvorwahl(CountryCode)
// des Standorts fehlen.
//
// Momentane Schwächen:
// Die Funktion versteht nur den Standard NationalExitCode "00"
// Die abweichenden NationalExitCodes sind für:
// USA und Canada "011"
// Kuba "119"
// Suedafrika "09"
// diese Exitcodes sind noch nicht implementiert
// Nur als Beispiel: Von Amerika nach Deutschland telefoniert man mit der Vorwahl
// "01149" statt wie sonst üblich "0049" -> der NationalExitCode ist eben ein anderer
Function EqualPhoneNumber(KnownNumber : String;
                          UnknownNumber : String;
                          InternExitCode : String;
                          AreaCode : String;
                          CountryCode : String;
                          NationalExitCode : String) : Boolean;
Var
         LastIndex : Integer;
         RemainingKnownNumber : String;
         RemainingUnknownNumber : String;
         MatchingNumber : String;
         RemainingAreaCode : String;
         RemainingCountryCode : String;

  // Liefert die erste unterschiedliche Stelle oder 0 wenn
  // keine Unterschiede bestehen.
  Function EqualStr(a : String;
                    b : String) : Integer;
  Var I : Integer;
      L : Integer;
      iLenA : Integer;
      iLenB : Integer;
  Begin
    iLenA := Length(a);
    iLenB := Length(b);
    L := Min(iLenA,iLenB);
    For i := 1 to L Do
    Begin
      if a[i] <> b[i] then
      Begin
        result := i;
        exit;
      end;
    end;
    if iLenA <> iLenB then begin
      Result := succ(L);
      exit;
    end else begin
      Result := 0;
    end;
  end;

Begin
  Result := false;
  UnknownNumber := StringReplace(UnknownNumber,'+',NationalExitCode,[]);
  KnownNumber := StringReplace(KnownNumber,'+',NationalExitCode,[]);
  if (UnknownNumber <> '') and (KnownNumber <> '') then
  Begin
    KnownNumber := ReverseString(KnownNumber);
    UnknownNumber := ReverseString(UnknownNumber);
    AreaCode := ReverseString(areaCode);
    CountryCode := ReverseString(CountryCode);
    InternExitCode := ReverseString(InternExitCode);

    // Nummer von Rechts an vergleichen
    Lastindex := EqualStr(UnknownNumber, KnownNumber);

    // Die Nummern stimmen nicht überein:
    // Es gibt einen Unterschied
    // in InternExitCode
    // oder CountryCode
    // oder AreaCode
    if LastIndex > 0 then
    Begin
      // Die Teilstrings holen, ab dem Beginn des Unterschiedes
// --> RemainingKnownNumber := copy(KnownNumber, LastIndex, Length(KnownNumber) - LastIndex);
      RemainingKnownNumber := copy(KnownNumber, LastIndex, Length(KnownNumber));
// --> RemainingUnknownNumber := copy(UnknownNumber, LastIndex, Length(RemainingUnknownNumber) - LastIndex);
      RemainingUnknownNumber := copy(UnknownNumber, LastIndex, Length(UnknownNumber));
      // Der übereinstimmende Teil der Nummern
// --> MatchingNumber := copy(KnownNumber, 1, LastIndex);
      MatchingNumber := copy(KnownNumber, 1, LastIndex - 1);

      if RemainingKnownNumber <> 'then
      Begin
        // Area Code in RemainingKnownNumber entfernen wenn er gleich dem
        // Standort ist
        Lastindex := EqualStr(RemainingKnownNumber,AreaCode);

        If Lastindex > 0 then
        Begin
// --> RemainingAreacode := Copy(Areacode, LastIndex, Length(Areacode) - LastIndex);
          RemainingAreacode := Copy(Areacode, LastIndex, Length(Areacode));
          if RemainingAreacode = '0then // Ist das eine allgemeine Regel?
                                          // In Italien ist die 0 Teil der Nummer,
                                          // dort sollte der AreaCode dann besser leer sein.
// --> RemainingKnownNumber := Copy(RemainingKnownNumber, LastIndex, Length(RemainingKnownNumber) - LastIndex);
            RemainingKnownNumber := Copy(RemainingKnownNumber, LastIndex, Length(RemainingKnownNumber));
          //Sonst nichts enfernen
        end
        else
          RemainingKnownNumber := '';
      end; //if RemainingKnownNumber <> '' then

      if RemainingKnownNumber <> 'then
      Begin
        // Country Code in RemainingKnownNumber entfernen wenn er gleich dem
        // Standort ist
        Lastindex := EqualStr(CountryCode,RemainingKnownNumber);
        If Lastindex > 0 then
        Begin
// --> RemainingCountryCode := Copy(CountryCode, LastIndex, Length(CountryCode) - LastIndex);
          RemainingCountryCode := Copy(CountryCode, LastIndex, Length(CountryCode));
          if (RemainingCountryCode = NationalExitCode) then
          begin
// --> RemainingKnownNumber := Copy(RemainingKnownNumber, Lastindex, Length(RemainingKnownNumber) - LastIndex)
            RemainingKnownNumber := Copy(RemainingKnownNumber, Lastindex, Length(RemainingKnownNumber))
            // Wenn das Programm in den USA laufen würde, müsste jetzt auf einen
            // abweichenden Exitcode (011 für Nordamerika) geprüft werden
          end
        end
        else
          RemainingKnownNumber := '';
      end; // if RemainingKnownNumber <> '' then

      If RemainingKnownNumber <> 'then
      Begin
         // Amt entfernen falls vorhanden
         If RemainingKnownNumber = InternExitCode then
           RemainingKnownNumber := ''
      end; // If RemainingKnownNumber <> '' then

      If RemainingUnknownNumber <> 'then
      Begin
        // Area Code in RemainingUnknownNumber entfernen wenn er gleich dem
        // Standort ist
        Lastindex := EqualStr(RemainingUnknownNumber,AreaCode);
        If Lastindex > 0 then
        Begin
// --> RemainingAreacode := Copy(Areacode, LastIndex, Length(Areacode) - LastIndex);
          RemainingAreacode := Copy(Areacode, LastIndex, Length(Areacode));
          if RemainingAreacode = '0then
// --> RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)-LastIndex );
            RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber));
          //Sonst nichts enfernen
        end
        else
          RemainingUnknownNumber := '';
      end; // If RemainingUnknownNumber <> '' then

      if RemainingUnknownNumber <> 'then
      Begin
        // Country Code in RemainingUnknownNumber entfernen wenn er gleich dem
        // Standort ist
        Lastindex := EqualStr(CountryCode,RemainingUnknownNumber);
        If Lastindex > 0 then
        Begin
// --> RemainingCountryCode := Copy(CountryCode, LastIndex, Length(CountryCode) - LastIndex);
          RemainingCountryCode := Copy(CountryCode, LastIndex, Length(CountryCode));
          if RemainingCountryCode = NationalExitCode then
          begin
// --> RemainingUnknownNumber := Copy(RemainingUnknownNumber, Lastindex, Length(RemainingUnknownNumber) - LastIndex)
            RemainingUnknownNumber := Copy(RemainingUnknownNumber, Lastindex, Length(RemainingUnknownNumber))
            // Wenn das Programm in den USA laufen würde müste jetzt auf einen
            // abweichenden Exitcode(011 für Nordamerika) geprüft werden
          end
        end
        else
          RemainingUnknownNumber := '';
      end; // if RemainingUnknownNumber <> '' then

      If RemainingUnknownNumber <> 'then
      Begin
         // Amt entfernen falls vorhanden
         If RemainingUnknownNumber = InternExitCode then
           RemainingUnknownNumber := ''
      end; // If RemainingUnknownNumber <> '' then

      // Das dürfte zu grob sein!!!
// --> result := (RemainingKnownNumber = '') and (RemainingKnownNumber = '');
      result := (RemainingKnownNumber = '') and (RemainingUnKnownNumber = '');
    end // if LastIndex > 0 then
    else
      result := true; // Wenn volle Übereinstimmung
  end; // if (UnknownNumber <> '') and
       // (KnownNumber <> '') then
end;

end.
Code:
Für internen Exitcode = 9, Areacode = 030, Countrycode = 0049 und Nationaler Exitcode = 00 bekomme ich momentan folgende Ergebnisse:

bekannt         und         unbekannt
123456          und 123456          stimmen überein
123456          und 0211123456          stimmen nicht überein
9123456          und 123456          stimmen überein
123456          und 0049123456          stimmen überein
123456          und +49123456          stimmen überein
123456          und 0049211123456          stimmen nicht überein
123456          und +49211123456          stimmen nicht überein
0211123456       und 0049211123456          stimmen nicht überein
0211123456       und +49211123456          stimmen nicht überein
0049171123456789       und 0171123456789          stimmen nicht überein
123456          und 030123456          stimmen überein
123456          und 004930123456          stimmen überein
123456          und +4930123456          stimmen überein
030123456          und 030123456          stimmen überein
030123456          und 004930123456          stimmen nicht überein
030123456          und +4930123456          stimmen nicht überein
+4930123456       und 030123456          stimmen nicht überein
+4930123456       und 004930123456          stimmen überein
+4930123456       und +4930123456          stimmen überein
004930123456       und 030123456          stimmen nicht überein
004930123456       und 004930123456          stimmen überein
004930123456       und +4930123456          stimmen überein

Für internen Exitcode = 9, Areacode = 06132, Countrycode = 0049 und Nationaler Exitcode = 00 bekomme ich momentan folgende Ergebnisse:

bekannt         und         unbekannt
123456          und 123456          stimmen überein
123456          und 0211123456          stimmen nicht überein
9123456          und 123456          stimmen überein
123456          und 0049123456          stimmen überein
123456          und +49123456          stimmen überein
123456          und 0049211123456          stimmen nicht überein
123456          und +49211123456          stimmen nicht überein
0211123456       und 0049211123456          stimmen nicht überein
0211123456       und +49211123456          stimmen nicht überein
0049171123456789       und 0171123456789          stimmen nicht überein
123456          und 030123456          stimmen nicht überein
123456          und 004930123456          stimmen nicht überein
123456          und +4930123456          stimmen nicht überein
030123456          und 030123456          stimmen überein
030123456          und 004930123456          stimmen nicht überein
030123456          und +4930123456          stimmen nicht überein
+4930123456       und 030123456          stimmen nicht überein
+4930123456       und 004930123456          stimmen überein
+4930123456       und +4930123456          stimmen überein
004930123456       und 030123456          stimmen nicht überein
004930123456       und 004930123456          stimmen überein
004930123456       und +4930123456          stimmen überein
Momentan hab' ich nicht viel Zeit, um weiter zu testen, frühestens heute Abend wieder, aber lieber was länger brauchen, als 'ne halbe Lösung oder 'nen Schnellschuss.
  Mit Zitat antworten Zitat