Thema: Delphi Handynummer zu ordnen

Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#34

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 10:58
Zitat von QuickAndDirty:
Eine Sache stört mich noch. Denn es kann eine ungünstige Kombination aus Amt und Ortsvorwahl
wie eine Landesvorwahl ohne Amt interpretiert werden.
Amt müsste Priorität haben!
Wie lang kann Amt sein? Mehr als eine Stelle, wenn nein, ist Amt, wenn der Rest eins lang ist (oh' watt fürn deutsch )
Momentan besteht der Quelltext ja aus mehreren aufeinanderfolgenden If-Blöcken. Wäre es eventuell sinnvoll, jeweils dazwischen den Rest in RemainingKnownNumber bzw. RemainingUnKnownNumber auf Gleichheit mit dem Amt zu prüfen?

Erster Test:

interner ExitCode = 9
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0211123456 und 0049211123456 unterscheiden sich <-- nicht korrekt
0211123456 und +49211123456 unterscheiden sich <-- nicht korrekt
0049171123456789 und 0171123456789 unterscheiden sich <-- nicht korrekt
030123456 und 004930123456 unterscheiden sich <-- nicht korrekt
030123456 und +4930123456 unterscheiden sich <-- nicht korrekt
+4930123456 und 030123456 unterscheiden sich <-- nicht korrekt
+4930123456 und 004930123456 stimmen überein <-- korrekt
+4930123456 und +4930123456 stimmen überein <-- korrekt
004930123456 und 030123456 unterscheiden sich <-- nicht korrekt
004930123456 und 004930123456 stimmen überein <-- korrekt
004930123456 und +4930123456 stimmen überein <-- korrekt

Die Erkennung beim CountryCode scheint noch zu hapern, wenn er auf einer Seite fehlt.

interner ExitCode = 9
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0211123456 und 0049211123456 unterscheiden sich <-- nicht korrekt
0211123456 und +49211123456 unterscheiden sich <-- nicht korrekt
0049171123456789 und 0171123456789 unterscheiden sich <-- nicht korrekt
030123456 und 030123456 stimmen überein <-- korrekt
030123456 und 004930123456 unterscheiden sich <-- nicht korrekt
030123456 und +4930123456 unterscheiden sich <-- nicht korrekt
+4930123456 und 030123456 unterscheiden sich <-- nicht korrekt
+4930123456 und 004930123456 stimmen überein <-- korrekt
+4930123456 und +4930123456 stimmen überein <-- korrekt
004930123456 und 030123456 unterscheiden sich <-- nicht korrekt
004930123456 und 004930123456 stimmen überein <-- korrekt
004930123456 und +4930123456 stimmen überein <-- korrekt

Bei den Handynummern mache ich momentan diese Zeile
Delphi-Quellcode:
if RemainingAreacode = '0then
  RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber));
für das "Nichterkennen" verantwortlich, bin mir aber nicht sicher.

Jetzt kommt nur grobe "Analyse": Die Vorwahl-0 und Amt = 0 können zu einem Konflikt führen, wenn Amt <> 0 tritt der anscheined nicht auf.

Für die Vorwahl-0 wird keine Gleichheit mit dem CountryCode erkannt.

Habe den Quelltext nochmal mit dem Debugger unter die Lupe genommen und bin zu den folgenden mit // --> S.B. und // <-- S.B. markierten Änderungen gekommen. Leider ist der CountryCode 9400 zweimal im Quelltext fest verdrahtet, da ich keine allgemeinere Lösung gefunden habe.
Delphi-Quellcode:
unit Teltools;

interface

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

implementation

uses strutils,sysutils,math;

// 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;

  Function FilterString(s,AllowedChars:String):String;
  var i, j : integer;
      Erlaubt : boolean;
  Begin
    Result := s;
    For i := 1 to length(s) do
    Begin
      Erlaubt := false;
      for j := 1 to Length(AllowedChars) do
      Begin
        if (Result[i] = AllowedChars[j]) then
        Begin
          Erlaubt := true;
          Break;
        end
      end;
      if not erlaubt then
        delete(result,i,1);
    end;
  end;
  
Begin
  Result := false;
// --> S.B.
  // UnknownNumber := FilterString(StringReplace(UnknownNumber,'+','00',[]),'0123456789') ;
  UnknownNumber := FilterString(StringReplace(UnknownNumber,'+',NationalExitCode,[]),'0123456789') ;
  // KnownNumber := FilterString(StringReplace(KnownNumber,'+','00',[]),'0123456789') ;
  KnownNumber := FilterString(StringReplace(KnownNumber,'+',NationalExitCode ,[]),'0123456789') ;
// <-- S.B.
  if (UnknownNumber <> '') and (KnownNumber <> '') then
  Begin
    KnownNumber := ReverseString(KnownNumber);
    UnknownNumber := ReverseString(UnknownNumber);
    AreaCode := ReverseString(areaCode);
    CountryCode := ReverseString(CountryCode);
    InternExitCode := ReverseString(InternExitCode);
    NationalExitCode := ReverseString(NationalExitCode); // <- Das hier nicht vergessen

    // 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));
      RemainingUnknownNumber := copy(UnknownNumber, LastIndex, Length(UnknownNumber));
      // Der übereinstimmende Teil der Nummern
      // im Moment noch zu nichts zu gebrauchen
      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));
          if RemainingAreacode = '0then // Ist das eine allgemeine Regel?
                                          // In Italien ist die 0 Teil der Nummer,
                                          // dort sollte der AreaCode dann besser leer sein.
                                          // A.R. Genau. Italien kennt keine Areacodes.
            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));
          if (RemainingCountryCode = NationalExitCode) then
          begin
            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));
          if RemainingAreacode = '0then
            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));
          if RemainingCountryCode = NationalExitCode then
          begin
            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

// --> S.B.
      // Bis hierher wird keine Gleichheit für Vorwahl-0 und CountryCode erkannt.
      If (RemainingKnownNumber = '0') // Diese Einschränkung, da nur für Deutschland gültig?
      And (CountryCode = '9400') then // Ist das verallgemeinerbar?
      // Oder könnte man hergehen und eine verbleibende 0 mit einem Leerstring gleichsetzen?
      Begin
        RemainingKnownNumber := '';
      end;
// <-- S.B.

// --> S.B.
      // Bis hierher wird keine Gleichheit für Vorwahl-0 und CountryCode erkannt.
      If (RemainingUnKnownNumber = '0') // Diese Einschränkung, da nur für Deutschland gültig?
      And (CountryCode = '9400') then // Ist das verallgemeinerbar?
      // Oder könnte man hergehen und eine verbleibende 0 mit einem Leerstring gleichsetzen?
      Begin
        RemainingUnKnownNumber := '';
      end;
// <-- S.B.

// --> S.B.
      // Das dürfte zu grob sein!!! A.R. kann sein mal testen S.B. der Kommentar bezog sich auf die vorherige Variante des Rückgabewertes, kann daher entfallen.
// <-- S.B.
      result := (RemainingKnownNumber = '') and (RemainingUnKnownNumber = '');
    end // if LastIndex > 0 then
    else
      result := true; // Wenn volle Übereinstimmung
  end; // if (UnknownNumber <> '') and
       // (KnownNumber <> '') then
end;

end.

(*
// --> S.B. Das funktioniert so (noch) nicht
      // Alternativ zu den am Ende eingefügten Blöcken mit der festen 9400
      If (RemainingKnownNumber = '0') // Diese Einschränkung, da nur für Deutschland gültig?
      And (RemainingUnKnownNumber = CountryCode) then  // Ist das verallgemeinerbar?
      Begin
        RemainingKnownNumber := '';
        RemainingUnKnownNumber := '';
      end;

      If (RemainingUnKnownNumber = '0') // Diese Einschränkung, da nur für Deutschland gültig?
      And (RemainingKnownNumber = CountryCode) then  // Ist das verallgemeinerbar?
      Begin
        RemainingKnownNumber := '';
        RemainingUnKnownNumber := '';
      end;
// <-- S.B.
*)
Zwei Tests erbrachten folgende Ergebnisse:
interner ExitCode = 9
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
123456 und 123456 stimmen überein
123456 und 0211123456 unterscheiden sich
9123456 und 123456 stimmen überein
123456 und 0049123456 stimmen überein
123456 und +49123456 stimmen überein
123456 und 0049211123456 unterscheiden sich
123456 und +49211123456 unterscheiden sich
0211123456 und 0049211123456 stimmen überein
0211123456 und +49211123456 stimmen überein
0049171123456789 und 0171123456789 stimmen ü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 überein
030123456 und +4930123456 stimmen überein
+4930123456 und 030123456 stimmen überein
+4930123456 und 004930123456 stimmen überein
+4930123456 und +4930123456 stimmen überein
004930123456 und 030123456 stimmen überein
004930123456 und 004930123456 stimmen überein
004930123456 und +4930123456 stimmen überein

interner ExitCode = 9
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

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

Die Ergebnisse sollten meiner Meinung nach stimmen.
  Mit Zitat antworten Zitat