unit Teltools;
interface
uses classes;
Function EqualPhoneNumber(KnownNumber,
UnknownNumber,
InternExitCode,
AreaCode,
CountryCode,
NationalExitCode :
String;
NonAreaPrefixCountryCodes:TStrings =
Nil) : 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
//
// an NonAreaPrefixCountryCodes kann ein TStrings mit den Ländercodes die Kein Vorwahl System haben übergeben
// werden, z.B. "0031" für Italien. Es wird nur der StandardExitCodes "00" in dieser Liste erlaubt.
// Wenn NonAreaPrefixCountryCodes nihct angegeben wird so werden die Ortsvorwahlullen immer ignoriert.
Function EqualPhoneNumber(KnownNumber,
UnknownNumber,
InternExitCode,
AreaCode,
CountryCode,
NationalExitCode :
String;
NonAreaPrefixCountryCodes:TStrings =
Nil) : Boolean;
Var
LastIndex : Integer;
RemainingKnownNumber :
String;
RemainingUnknownNumber :
String;
MatchingNumber :
String;
RemainingAreaCode :
String;
RemainingCountryCode :
String;
RemainingInternExitCode:
String;
UnkownNumberCountryCode:
String;
KownNumberCountryCode :
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
If NonAreaPrefixCountryCodes <>
nil then
Begin
// Landesvorwahl mit Standardexitcode merken
UnkownNumberCountryCode := CountryCode;
UnkownNumberCountryCode := StringReplace(UnkownNumberCountryCode,NationalExitCode,'
00',[]);
KownNumberCountryCode := UnkownNumberCountryCode;
end;
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
Begin
if NonAreaPrefixCountryCodes <>
nil then
Begin
KownNumberCountryCode := RemainingKnownNumber;
KownNumberCountryCode := StringReplace(KownNumberCountryCode,NationalExitCode,'
00',[]);
KownNumberCountryCode := ReverseString(KownNumberCountryCode);
end;
RemainingKnownNumber := '
';
end;
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
Begin
if NonAreaPrefixCountryCodes <>
nil then
Begin
UnkownNumberCountryCode := RemainingUnknownNumber;
UnkownNumberCountryCode := StringReplace(UnkownNumberCountryCode,NationalExitCode,'
00',[]);
UnkownNumberCountryCode := ReverseString(UnkownNumberCountryCode);
end;
RemainingUnknownNumber := '
';
end
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
If (NonAreaPrefixCountryCodes =
nil)
or
( (NonAreaPrefixCountryCodes <>
nil)
and
(NonAreaPrefixCountryCodes.IndexOF(KownNumberCountryCode) = -1)
)
Then
Begin
If (RemainingKnownNumber = '
0')
then
Begin
RemainingKnownNumber := '
';
end
end;
If (NonAreaPrefixCountryCodes =
nil)
or
( (NonAreaPrefixCountryCodes <>
nil)
and
(NonAreaPrefixCountryCodes.IndexOf(UnkownNumberCountryCode) = -1)
)
Then
Begin
If (RemainingUnKnownNumber = '
0')
then
Begin
RemainingUnKnownNumber := '
';
end;
end;
result := (RemainingKnownNumber = '
')
and (RemainingUnKnownNumber = '
');
end // if LastIndex > 0 then
else
result := true;
// Wenn volle Übereinstimmung
end;
// if (UnknownNumber <> '') and
// (KnownNumber <> '') then
end;
end.