Thema: Delphi Handynummer zu ordnen

Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.889 Beiträge
 
Delphi 12 Athens
 
#37

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 13:45
Also Führende nullen zu löschen ist nicht schlimm wenn zuvor Amt korrekt abgehandelt wurde.
Allerdings würde das in Italien wirklich zu gleichen Telefonnummern führen obwohl sie nicht gleich sind.
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.
//
// Die abweichenden NationalExitCodes sind für:
// Standard "00"
// USA und Canada "011"
// Kuba "119"
// Suedafrika "09"
// 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;
         RemainingInternExitCode: 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;
  UnknownNumber := FilterString(StringReplace(UnknownNumber,'+',NationalExitCode,[]),'0123456789') ;
  KnownNumber := FilterString(StringReplace(KnownNumber,'+',NationalExitCode,[]),'0123456789') ;
  if (UnknownNumber <> '') and (KnownNumber <> '') then
  Begin
    KnownNumber := ReverseString(KnownNumber);
    UnknownNumber := ReverseString(UnknownNumber);
    AreaCode := ReverseString(areaCode);
    CountryCode := ReverseString(CountryCode);
    InternExitCode := ReverseString(InternExitCode);
    NationalExitCode := ReverseString(NationalExitCode);

    // 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 = '0') or
             (RemainingAreacode = '') then
            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) or
             (RemainingCountryCode = '') 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
         Lastindex := EqualStr(InternExitCode,RemainingKnownNumber);
         If lastindex > 0 then
         Begin
           RemainingInternExitCode := Copy (InternExitCode,Lastindex,length(InternExitCode));
           If (RemainingInternExitCode = '') then
             RemainingknownNumber := copy(RemainingKnownNumber, Lastindex, Length(RemainingKnownNumber))
         end
         else
           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 = '0') or
             (RemainingAreacode = '') then
            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) or
             (RemainingCountryCode = '') 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
         Lastindex := EqualStr(InternExitCode,RemainingUnknownNumber);
         If lastindex > 0 then
         Begin
           RemainingInternExitCode := Copy (InternExitCode,Lastindex,length(InternExitCode));
           If (RemainingInternExitCode = '') then
             RemainingUnknownNumber := copy(RemainingUnknownNumber, Lastindex, Length(RemainingUnknownNumber))
         end
         else
           RemainingUnknownNumber := '';
      end; // If RemainingUnknownNumber <> '' then

{A.R. Testweise Auskommentiert
// --> 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.
}

      result := (RemainingKnownNumber = '') and (RemainingUnKnownNumber = '');
    end // if LastIndex > 0 then
    else
      result := true; // Wenn volle Übereinstimmung
  end; // if (UnknownNumber <> '') and
       // (KnownNumber <> '') then
end;

end.
Hier habe ich mal die Amts Prüfung eingesetzt.
Wenn ich deinen Code auskommentiere erkennt er es für Italien auch, aber eben dann nicht mehr für normale Ferngespräche

Beispiel:
Amt 0
Stadt 030
Land 0049
Nationalexitcode 00

00049171123456 und 00171123456 sind unterschiedlich
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat