|
nahpets
(Gast)
n/a Beiträge |
#24
![]() 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! ![]() 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:
für das "Nichterkennen" verantwortlich, bin mir aber nicht sicher.
if RemainingAreacode = '0' then
RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)); 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:
Zwei Tests erbrachten folgende Ergebnisse:
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 = '0' then // 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 = '0' 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 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. *) 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. |
![]() |
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 |
![]() |
![]() |