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;
UnknownNumber := FilterString(StringReplace(UnknownNumber,'
+','
00',[]),'
0123456789') ;
KnownNumber := FilterString(StringReplace(KnownNumber,'
+','
00',[]),'
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')
and
(NationalExitCode = '
00')
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.
// aber es wird Im NANPA Raum z.B. nicht weggelassen
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')
and
(NationalExitCode = '
00')
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
result := (RemainingKnownNumber = '
')
and (RemainingUnKnownNumber = '
');
end // if LastIndex > 0 then
else
result := true;
// Wenn volle Übereinstimmung
end;
// if (UnknownNumber <> '') and
// (KnownNumber <> '') then
end;
end.