|
![]() |
|
nahpets
(Gast)
n/a Beiträge |
#1
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 = '0' then // 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 = '0' then // --> 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:
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.
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 |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |