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.