Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Handynummer zu ordnen (https://www.delphipraxis.net/122281-handynummer-zu-ordnen.html)

QuickAndDirty 13. Okt 2008 09:19


Handynummer zu ordnen
 
Hallo, ich will eine Software die den Anrufer anhand der Telefonnummer identifiziert erweitern.
Zur zeit ist das recht einfach weil ich einfach die Nummern vergleiche.
Jetzt habe ich Standort Einstellungen eingebaut (Amt /Ort/ Land), um es möglich zu machen mit
dem deutschen Handy aus dem Ausland anzurufen.

Da ich das nicht Testen kann (außer am Kunden) hier folgende Frage:
Wenn ein Deutsches Handy aus dem Ausland anruft, welche Landesvorwahl wird dann mitgesendet?

Es scheint mit Italien eine Besonderheit zu geben, das die führende Null der Ortsvorwahl nicht
weg fällt wenn man die Landesvorwahl davor wählt, kennt jemand staaten bei denen das außerdem noch so ist?

Larsi 13. Okt 2008 09:21

Re: Handynummer zu ordnen
 
Ich glaube da steht immer 0049 vor.

BullsEye 13. Okt 2008 09:22

Re: Handynummer zu ordnen
 
Zitat:

Zitat von QuickAndDirty
Es scheint mit Italien eine Besonderheit zu geben, das die führende Null der Ortsvorwahl nicht
weg fällt wenn man die Landesvorwahl davor wählt, kennt jemand staaten bei denen das außerdem noch so ist?

Ich glaube, bin mir da aber nicht sicher, in Kroatien ist es auch so!

Zitat:

Zitat von QuickAndDirty
Wenn ein Deutsches Handy aus dem Ausland anruft, welche Landesvorwahl wird dann mitgesendet?

Normalerweise +0049

Sharky 13. Okt 2008 09:23

Re: Handynummer zu ordnen
 
Zitat:

Zitat von BullsEye
... Normalerweise +0049

Entweder 0049 oder +49

generic 13. Okt 2008 10:20

Re: Handynummer zu ordnen
 
eigendlich nur +49 da das + für den lokalen exitcode steht.

der exitcode in deutschland ist 00.
in den usa sieht das schon ganz anders aus, da ist dieser 011.

http://www.countrycodes.com

QuickAndDirty 13. Okt 2008 10:42

Re: Handynummer zu ordnen
 
Na toll,
und wie soll ich dann die Callingnumber einer Handynummer zu ordnen, wenn die mit 011 anfängt?
denn ich weiß ja nur meinen eigenen Standort 0049 und 011 sieht ja schon eher nach einer Ortsvorwahl aus.

nahpets 13. Okt 2008 10:59

Re: Handynummer zu ordnen
 
Hallo,
Zitat:

Zitat von QuickAndDirty
Na toll,
und wie soll ich dann die Callingnumber einer Handynummer zu ordnen, wenn die mit 011 anfängt?
denn ich weiß ja nur meinen eigenen Standort 0049 und 011 sieht ja schon eher nach einer Ortsvorwahl aus.

guckst Du hier: Vorwahlverzeichnis, Vorwahl mit 01 gibt es nicht, das sind "Sondernummern".
Eventuell hilft auch http://www.deutschland-suchen.de/vor...ern/index.html

QuickAndDirty 13. Okt 2008 11:39

Re: Handynummer zu ordnen
 
Ja Danke,
aber das Programm soll ja nicht nur hier in D funktionieren.

ist folgendes brauchbar um alle Standort Daten der Handynummer zu entfernen:
Delphi-Quellcode:
//Schneidet die Führenden Standortdaten ab.
Function LocalizeNumber(Nummer, Amt, Land : String):String;
var s : string;
    i : integer;
Begin


  //Amt entfernen
  i := Length(Amt);
  if i > 0 then
  Begin
    s := Leftstr(nummer,i);
    if s=Amt then
      nummer := Rightstr(nummer, length(nummer)-i);
  end
  //Amt entfernt

  nummer := StringReplace(nummer, '+', '00', []);//In den Standort Einstellungen kann kein "+" eingegeben werden.

  //Land entfernen
  i := Length(Land);
  if i > 0 then
  Begin
    s := Leftstr(nummer,i);
    if s=land then
      nummer := Rightstr(nummer, length(nummer)-i);
  end;
  //Land entfernt

  //Stadt oder Handynetz der Person sind ja in der DB mit angegeben
  //vor einem Vergleich werden dann noch alle führenden Nullen (vermutlich nur eine) entfernt

end;
Ich vergleiche das Resultat danach über eine Funktion die führenden Nullen ignoriert mit den
Telefonnummern in der Datenbank und gebe die ID des passenden Eintrags zurück...

Handynummer zu geordnet.

ist die funktion irgendwie unvollständig ? Oder eignet sie sich für meine Zwecke?

jokerfacehro 13. Okt 2008 11:45

Re: Handynummer zu ordnen
 
fang doch an die nummer von hinten an zu vergleichen, was denn vorne übrig bleibt ist denn die landes vorwahl wenn ausm ausland oder nix wenn inland

QuickAndDirty 13. Okt 2008 11:59

Re: Handynummer zu ordnen
 
Oh ja,
Gott bin ich blöd...
ich denke da nochmal genau drüber nach, aber das ich könnte klappen,
müssen noch Sicherhheitsabfragen rein so das nicht jemand der keine
Rufnummer sendet jemandem der keine eingetragen hat zugeordnet wird.

Es könnte wirklich sein das dann auch der Standort des Empfängers(PCs+isdnkarte)
nicht angegeben werden muss.

QuickAndDirty 13. Okt 2008 12:07

Re: Handynummer zu ordnen
 
hm, das ist dann evtl doch zu unscharf, oder?

jokerfacehro 13. Okt 2008 12:25

Re: Handynummer zu ordnen
 
ich versteh noch nicht ganz dein identifikationssystem, wenn du da setwas mehr erläuterst, wär schon nicht schlecht
am besten mit nem BSP

nahpets 13. Okt 2008 12:58

Re: Handynummer zu ordnen
 
Hallo,

weiß nicht, ob ich Dein Problem verstanden habe, gegeben seien folgende Telefonnummern:
Code:
nummer amt land   id
12345  0211 0049    1
67890  0221 0049    2
12344  0254 001     3
12387  06   0039    4

004921112345
004922167890
00125412344
00390612387
Du bekommst einen der unteren vier Werte (in der Form?) und willst ihn in der Datenbank suchen?
Das "Aufbröseln" halte ich für nicht trivial. Kannst Du nicht hergehen und in der Datenbank ein zusätzliches Feld einfügen, dass aus Land + Amt + Nummer besteht. Bei Inlandsanrufen kannst Du natürlich nicht damit rechnen, dass die 0049 oder +49 mitgeliefert wird. Fehlt bei der Nummer, die Du bekommst, entweder die 00 oder das +, so entfernst Du die führende 0 und ergänzt die Nummer um 0049, da es sich (meiner Vermutung nach) nur um Inlandsanrufe handeln kann.
Gut, dass ist jetzt wieder ein bisserl einfach. Im Ausland müsstest Du dann anstelle der 0049 die dort jeweils gültige Landesvorwahl hinzufügen. Dies sollte jedoch kein unlösbares Problem sein. Sofern das nicht international einheitlich geregelt ist, wirst Du nicht an landesspezifischen Lösungen vorbeikommen.

Bezüglich Italien schau mal hier: http://www.roma-antiqua.de/rom-reise...nieren#vorwahl, demnach müsste Italien eigentlich einfacher zu handhaben sein, als andere Länder. In Italien muss vor die italienische Nummer immer nur 0039 vorgesetzt werden und keine führende 0 entfernt werden.
Das ist jetzt keine Lösung, sondern nur mal so dahergeplappert, eventuell hilft's ja bei der Lösungsfindung.

QuickAndDirty 13. Okt 2008 13:57

Re: Handynummer zu ordnen
 
Ich kann die Datenbank nicht anpassen.
Also es gibt eine Tabelle mit
den Feldern
ID und Telefonnummer und über 90 weiteren absolut uninteressanten Feldern
ID ist die PersonalID unseres Opfers. Diese muss ich ermitteln.
Telefonnummer ist eine Handynummer, keine Nummer oder eine Festnetznummer.

für den Fall das es keine Nummer oder eine Festnetznummer ist reicht ein einfacher vergleich unter ignorieren der führenden Nullen (wegen Amt) aus.

Wenn es sich um ein im Inland genutztes und angemeldetes Handy handelt gibt es auch kein Problem mit der obigen Vergleichsmethode.

Nun mein, Problem. Wenn das Handy das Land verlässt würde standardmäßig +49 oder 0049 oder 01149 angehängt bzw. eine andere Landesvorwahl je nach Standort des Programms. dazu kommt dann noch evtl. eine Amts Null und eine Netzvorwahl.

Die Vergleichsroutine muss alle Anrufe richtig zuordnen oder eben ablehnen.

Den Standort und Amt kann man in der INI-Datei angeben...falls ich das benötige

nahpets 13. Okt 2008 15:01

Re: Handynummer zu ordnen
 
Hallo,

da hatte schonmal jemand so eine Frage: http://www.php-resource.de/forum/sho...d/t-49085.html, vielleicht reicht's für Ideen.
Läßt sich aus dem, was dort beschrieben steht, eventuell eine von Rechts- nach Linkslesemethodik entwickeln?

QuickAndDirty 13. Okt 2008 15:21

Re: Handynummer zu ordnen
 
Ich weiß nicht , ich schaue es mir an.
Im moment suche ich eine formale Grammatik um das ganze wasserdicht zu bekommen...ich hoffe das ich die nicht selbst entwickeln muss..
in den Regexforen gibts schon mal nichts was zuverlässig funktioniert und sich in eine Grammatik umwandeln ließe.

nahpets 13. Okt 2008 15:30

Re: Handynummer zu ordnen
 
Hallo,
Zitat:

Zitat von QuickAndDirty
Im moment suche ich eine formale Grammatik um das ganze wasserdicht zu bekommen...

Da hast Du Dir aber ein ehrgeiziges Ziel gesetzt.
Zitat:

Zitat von QuickAndDirty
ich hoffe das ich die nicht selnst entwickeln muss..

Das steht aber zu befürchten.
Habe schon häufiger Datenbestände bereinigen müssen und dabei auch die Telefonnummern vereinheitlichen müssen. Eine immer passende Regel habe ich nicht gefunden, egal ob einfach oder komplex. Es war immer eine nicht unerhebliche Restmenge von Hand zu korrigieren.

QuickAndDirty 13. Okt 2008 15:42

Re: Handynummer zu ordnen
 
Zitat:

Zitat von nahpets
Hallo,
Zitat:

Zitat von QuickAndDirty
Im moment suche ich eine formale Grammatik um das ganze wasserdicht zu bekommen...

Da hast Du Dir aber ein ehrgeiziges Ziel gesetzt.
Zitat:

Zitat von QuickAndDirty
ich hoffe das ich die nicht selnst entwickeln muss..

Das steht aber zu befürchten.
Habe schon häufiger Datenbestände bereinigen müssen und dabei auch die Telefonnummern vereinheitlichen müssen. Eine immer passende Regel habe ich nicht gefunden, egal ob einfach oder komplex. Es war immer eine nicht unerhebliche Restmenge von Hand zu korrigieren.

Hallo???
Ich will nicht demotiviert werden...meinst du das ernst? Ich meine es muss doch Produktionsregeln für Telefonummern samt Auslands und Netzvorwahlen geben, die eine wenn auch semantisch nicht existente so jedoch grammatisch korrekte Telefonnummer erzeugen können.

Wenn ich die Grammtik habe wüste ich schon wie ich daraus eine Funktion mache die die Nummern korrekt zuordnet.



hier ist die Aufgabe nochmal komplett ausgewalzt:(http://zer.ez.den.wikipedia.eu.licestudy.org/de/Daten )
Eine internationale Telefonvorwahl (auch Ländervorwahl, engl. country code) ist eine Rufnummer , die man wählt, um auf die logische Ebene eines nationalen Telefonnetz zu gelangen. Internationale Telefonvorwahlen bestehen aus zwei Teilen:
Einer Ziffernfolge, um auf die logische Ebene des internationalen Telefonnetzes zu gelangen. Diese hängt von dem Land ab, in dem man sich befindet, deswegen wird sie international einheitlich mit einem „+“ symbolisiert.
Einer Ziffernfolge, um von dort auf die logische Ebene des nationalen Telefonnetzes zu gelangen. Diese wird von der International Telecommunication Union (ITU) weltweit einheitlich vergeben. Beispiel (Ländervorwahl nach Deutschland): „+49“
Die Nummernkette zum Zugang vom lokalen Telefonnetz zum internationalen Telefonnetz, symbolisiert durch „+“, lautet z. B.
#„00“ gilt aus vielen Telefonnetzen, beispielsweise aus fast allen europäischen. In zahlreichen weiteren Ländern wird oder wurde bereits auf diese Ziffernfolge umgestellt.
#„011“ aus den USA und Kanada
#„119“ aus Kuba
#„09“ aus Südafrika
#in allen Global_System_for_Mobile_Communications -Netzen weltweit kann statt der Nummernkette auch „+“ direkt eingegeben werden.
Die Nummernkette vom internationalen Telefonnetz in das gewünschte nationale Telefonnetz (die eigentliche Landeskennzahl ) ist unabhängig vom Ausgangstelefonnetz, nach Deutschland also immer „49“. Für die drei genannten Beispiele erhält man damit:
#„00 49“ (viele Länder)
#„011 49“ (USA und Kanada)
#„119 49“ (Kuba)
#„09 49“ (Südafrika)
Die führende 0 der Telefonvorwahl im gewünschten Land muss manchmal weggelassen werden (Beispiel: Deutschland ), manchmal nicht (Beispiel: Italien ). Andere Beispiele für Ländercodes:

nahpets 13. Okt 2008 15:51

Re: Handynummer zu ordnen
 
Hallo,

ich möchte Dich nicht demotivieren, aber eine entsprechende Regel habe ich noch nicht gefunden. Das heißt nicht, dass es sie vielleicht doch gibt.

Zitat:

Wenn ich die Grammtik habe wüste ich schon wie ich daraus eine Funktion mache die die Nummern korrekt zuordnet
Das genau ist das Problem: Wie bilde ich eine Regel ab, die ich nicht kenne?

Hilft hier vielleichtWikipedia - Telefonnummern?

QuickAndDirty 13. Okt 2008 16:02

Re: Handynummer zu ordnen
 
Ich brauche also
+eine Liste aller Landesvorwahlen (habe ich schon)
-eine Liste aller Nationalen Exit-Codes (00,011,119, &c. )(wird international immer das + weitergegeben oder auch mal der Exit code?)
-eine Liste aller Länder mit Ortsvorwahl ( führende Null kann Wegfallen)
-eine Liste aller Länder ohne Ortsvorwahl(Führende Null ist teil der Telefonnummer)

Es muss doch möglich sein das zu finden.
Ich suche mal weiter, wäre ok wenn sich Leute die besser im Finden sind beteiligen, bitte , bitte, bitte

Klaus01 13. Okt 2008 16:03

Re: Handynummer zu ordnen
 
Hallo,

du willst deutsche MobilNummern ausfiltern auch wenn sie z.B. aus dem Ausland kommen?

Dann würde ich die Suche auch von hinten anfangen.
Denn für die deutschen Mobilfunkrufnummern gibt es wohl feste Regeln.

Grüße
Klaus

QuickAndDirty 13. Okt 2008 16:05

Re: Handynummer zu ordnen
 
Ja aber es soll auch funktionieren wenn das gerät in Italien steht und ein italienisches Handy seine heimat verlässt.
Es sind über dies nicht nur Mobilnummern sondern auch Festnetznummern...nur die wechseln ja ihr land nicht...Ausser so gegenden wie Ossetsien , Tschetschenien, &c.

QuickAndDirty 14. Okt 2008 14:55

Re: Handynummer zu ordnen
 
Hier mal ein spontaner Entwurf, mal einfach so runtergeschrieben
Bitte um Verbesserung vorschläge...vor allem was die Struktur angeht...
Sind da Logische Fehler die ich übersehen habe?
Delphi-Quellcode:
//A.R. meine Funktion, alles meins, alles .....
//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,UnknownNumber,InternExitCode, AreaCode, CountryCode:String):Boolean;
Var i,j,LastIndex:integer;
    RemainingKnownNumber,
    RemainingUnknownNumber,
    MatchingNumber,
    RemainingAreaCode,
    RemainingCountryCode : String;

  //Liefert die erste unterschiedliche stelle oder 0 wenn keine unterschiede bestehen
  Function EqualStr( a, b : String) : Integer;
  Var I, L, LastIndex:integer;
  Begin
    L := Min( Length(a), Length(b) );
    For i := 1 to L Do
    Begin
      if a[i]<>b[i] then
      Begin
        result := i;
        exit;
      end;
    end;
    if Length(a) <> Length(b) then
      Result := succ(L)
    else
      Result := 0;
  end;

Begin
  Result := false;
  UnknownNumber := StringReplace(UnknownNumber,'+','00',[]);
  KnownNumber := StringReplace(KnownNumber,'+','00',[]);
  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);

    if LastIndex > 0 then
    Begin
      RemainingKnownNumber := copy(KnownNumber, LastIndex, Length(KnownNumber));//<-geändert
      RemainingUnknownNumber := copy(UnknownNumber, LastIndex, Length(UnknownNumber));//<-Diese geändert
      MatchingNumber := copy(KnownNumber, 1, LastIndex);

      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));//<-geändert
          if RemainingAreacode = '0' then
            RemainingKnownNumber := Copy(RemainingKnownNumber, LastIndex, Length(RemainingKnownNumber));//<-geändert
          //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));//<-geändert
          if (RemainingCountryCode = '00') then
          begin
            RemainingKnownNumber := Copy(RemainingKnownNumber, Lastindex, Length(RemainingKnownNumber) )//<-geändert
            // 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
          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));//<-geändert
          if RemainingAreacode = '0' then
            RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber));//<-geändert
          //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));//<-geändert
          if RemainingCountryCode = '00' then
          begin
            RemainingUnknownNumber := Copy(RemainingUnknownNumber, Lastindex, Length(RemainingUnknownNumber))//<-geändert
            // 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 = '');//<- diese geändert
    end//if LastIndex > 0 then
    else
      result := true; //Wenn volle übereinstimmung

  end;//if (UnknownNumber <> '') and
      //    (KnownNumber <> '') then

end;

nahpets 14. Okt 2008 16:05

Re: Handynummer zu ordnen
 
Hallo,

da warst Du ja richtig fleißig :!:

Ein erster Test mit
Delphi-Quellcode:
me.lines.clear;
me.Lines.Add(ValueListEditor1.Cells[1,0] + ' ' + ValueListEditor1.Cells[0,0]);
for i := 1 to ValueListEditor1.RowCount - 1 Do begin
  if EqualPhoneNumber(ValueListEditor1.Cells[1,i],ValueListEditor1.Cells[0,i],
     '0',  // InternExitCode, 0 für Amt?
     '030', // AreaCode,      030 für Berlin?
     '0049' // CountryCode    0049 für Deutschland?
  ) then begin
    me.Lines.Add(ValueListEditor1.Cells[0,i] + ' und ' + ValueListEditor1.Cells[1,i] + ' stimmen überein');
  end else begin
    me.Lines.Add(ValueListEditor1.Cells[0,i] + ' und ' + ValueListEditor1.Cells[1,i] + ' sind unterschiedlich');
  end;
end;
liefert dieses Ergebnis:
Code:
bekannte Nummer unbekannte Nummer
0049171123456 und 0171123456 stimmen überein
+49211123456 und 0211123456 stimmen überein
003906123456 und +3906123456 stimmen überein
123456 und 0211123456 sind unterschiedlich
49211123456 und 0049211123456 stimmen überein
0221123456 und 0123456 stimmen überein
030123456 und 0123456 stimmen überein
Meiner Meinung nach ist der Vorletzte falsch, da AreaCode für Berlin.

Hier hab' ich eine Frage:
Delphi-Quellcode:
RemainingKnownNumber := copy(KnownNumber, LastIndex, Length(KnownNumber)-LastIndex );
RemainingUnknownNumber := copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)-LastIndex );
Warum -LastIndex?
Gegeben seien 004930123456789 und 9123456789
Bis LastIndex stimmen die Nummern von rechts gesehen überein (hier also LastIndex = 10 = erste Abweichung)
copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)-LastIndex ) ergibt copy(987654321039400,10,15 - 10) bzw. copy(987654321039400,10,5) es bleibt also 03940.copy(KnownNumber, LastIndex, Length(KnownNumber)-LastIndex) ergibt copy(9876543219,10,10 - 10) bzw. copy(9876543219,10,0), also ein Leerstring.
Übrig sollten aber bleiben 004930 und 9 um hier die Amtsvorwahl und unsere eigene Vorwahl (AreaCode) und Landesvorwahl (CountryCode) überprüfen zu können.
-LastIndex kann entfallen, dann bekommst Du immer den Rest, auch wenn Length() mehr ergeben sollte, als kopiert werden kann.

Auch hier habe ich ein Verständnisproblem:
Delphi-Quellcode:
Function EqualStr( a, b : String) : Integer;
Var I, L, LastIndex:integer;
Begin
  L := Min( Length(a), Length(b) );
  For i := 1 to L Do
  Begin
    if a[i]<>b[i] then
    Begin
      result := i;
      exit;
    end;
  end;
  if Length(a) <> Length(b) then
    Result := succ(L)
  else
    Result := 0;
end;
Wird in der For-Schleife kein Unterschied gefunden aber a und b sind unterschiedlich lang, dann ist als Ergebnis LastIndex um 1 größer als der kürzere der beiden Werte? Dann müsste das obige Copy doch immer einen Leerstring liefern?

QuickAndDirty 14. Okt 2008 22:42

Re: Handynummer zu ordnen
 
Zitat:

Zitat von nahpets
Hallo,

da warst Du ja richtig fleißig :!:

Ja ich kann es nicht ertragen das es sowas nicht schon gibt.

Zitat:

Zitat von nahpets
Ein erster Test mit
Delphi-Quellcode:
me.lines.clear;
me.Lines.Add(ValueListEditor1.Cells[1,0] + ' ' + ValueListEditor1.Cells[0,0]);
for i := 1 to ValueListEditor1.RowCount - 1 Do begin
  if EqualPhoneNumber(ValueListEditor1.Cells[1,i],ValueListEditor1.Cells[0,i],
     '0',  // InternExitCode, 0 für Amt?
     '030', // AreaCode,      030 für Berlin?
     '0049' // CountryCode    0049 für Deutschland?
  ) then begin
    me.Lines.Add(ValueListEditor1.Cells[0,i] + ' und ' + ValueListEditor1.Cells[1,i] + ' stimmen überein');
  end else begin
    me.Lines.Add(ValueListEditor1.Cells[0,i] + ' und ' + ValueListEditor1.Cells[1,i] + ' sind unterschiedlich');
  end;
end;
liefert dieses Ergebnis:
Code:
bekannte Nummer unbekannte Nummer
0049171123456 und 0171123456 stimmen überein
+49211123456 und 0211123456 stimmen überein
003906123456 und +3906123456 stimmen überein
123456 und 0211123456 sind unterschiedlich
49211123456 und 0049211123456 stimmen überein
0221123456 und 0123456 stimmen überein
030123456 und 0123456 stimmen überein
Meiner Meinung nach ist der Vorletzte falsch, da AreaCode für Berlin.

ja, das geht schief, hmmm muss ich mal debuggen. Die funktion ist von meiner seite her noch garnicht getestet....

Zitat:

Zitat von nahpets
Hier hab' ich eine Frage:
Delphi-Quellcode:
RemainingKnownNumber := copy(KnownNumber, LastIndex, Length(KnownNumber)-LastIndex );
RemainingUnknownNumber := copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)-LastIndex );
Warum -LastIndex?
Gegeben seien 004930123456789 und 9123456789
Bis LastIndex stimmen die Nummern von rechts gesehen überein (hier also LastIndex = 10 = erste Abweichung)
copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber)-LastIndex ) ergibt copy(987654321039400,10,15 - 10) bzw. copy(987654321039400,10,5) es bleibt also 03940.copy(KnownNumber, LastIndex, Length(KnownNumber)-LastIndex) ergibt copy(9876543219,10,10 - 10) bzw. copy(9876543219,10,0), also ein Leerstring.
Übrig sollten aber bleiben 004930 und 9 um hier die Amtsvorwahl und unsere eigene Vorwahl (AreaCode) und Landesvorwahl (CountryCode) überprüfen zu können.
-LastIndex kann entfallen, dann bekommst Du immer den Rest, auch wenn Length() mehr ergeben sollte, als kopiert werden kann.

naja, jedes sollte in sich eine Abgeschlossene Prüfung sein, bist du sicher das er die 9 nicht mit kopiert?
wie würdest du die stelle umbauen, poste mal bitte die komplette Funktion inkl. der Änderungen,
so einzeln kapier ich das nicht...
Zitat:

Zitat von nahpets
Auch hier habe ich ein Verständnisproblem:
Delphi-Quellcode:
Function EqualStr( a, b : String) : Integer;
Var I, L, LastIndex:integer;
Begin
  L := Min( Length(a), Length(b) );
  For i := 1 to L Do
  Begin
    if a[i]<>b[i] then
    Begin
      result := i;
      exit;
    end;
  end;
  if Length(a) <> Length(b) then
    Result := succ(L)
  else
    Result := 0;
end;
Wird in der For-Schleife kein Unterschied gefunden aber a und b sind unterschiedlich lang, dann ist als Ergebnis LastIndex um 1 größer als der kürzere der beiden Werte? Dann müsste das obige Copy doch immer einen Leerstring liefern?

Exakt. Das ist beabsichtigt. So das ich den Anfangsindex bekomme ab dem die beiden Nummern unterschiedliche werte enthalten.
Der Kürzere String ist ja dann schon 100% im längeren enthalten und ich muss nur noch den längeren String lokalisieren.

Wenn ich alle Standortinformationen in beiden RemainingsStrings eliminieren kann ist das die selbe Rufnummer.

QuickAndDirty 14. Okt 2008 23:49

Re: Handynummer zu ordnen
 
Evtl. ist das verfahren nicht sicher.
Das jetzige Verfahren in Worten:
-Von Rechts die Nummern vergleichen und den gemeinsamen Teil der Nummer löschen

-RestNummer1 von Rechts mit dem Areacode vergleichen und wenn übereinstimmung besteht löschen
-RestNummer1 von Rechts mit dem Countrycode vergleichen und wenn übereinstimmung besteht löschen
-RestNummer1 mit dem Amt vergleichen und wenn übereinstimmung besteht löschen

-RestNummer2 von Rechts mit dem Areacode vergleichen und wenn übereinstimmung besteht löschen
-RestNummer2 von Rechts mit dem Countrycode vergleichen und wenn übereinstimmung besteht löschen
-RestNummer2 mit dem Amt vergleichen und wenn übereinstimmung besteht löschen

-Wenn beide Restnummern leer sind ist es die gleiche Telefonnummer.

Möglicherweise besseres Verfahren in Worten:
-Von Rechts die Nummern vergleichen und den gemeinsamen Teil der Nummer löschen (das bleibt)

-RestNummer1 von links mit dem Amt+Countrycode+Areacode vergleichen und wenn zu 100% enthalten dann Amt+Countrycode+Areacode löschen
-ansonnsten RestNummer1 von Links mit Amt+Areacode vergleichen und wenn zu 100% enthalten dann Amt+Areacode löschen
-ansonnsten RestNummer1 von Links mit Amt vergleichen und wenn zu 100% enthalten dann Amt löschen

-RestNummer2 von links mit dem Amt+Countrycode+Areacode vergleichen und wenn zu 100% enthalten dann Amt+Countrycode+Areacode löschen
-ansonnsten RestNummer2 von Links mit Amt+Areacode vergleichen und wenn zu 100% enthalten dann Amt+Areacode löschen
-ansonnsten RestNummer2 von Links mit Amt vergleichen und wenn zu 100% enthalten dann Amt löschen

-Wenn beide Restnummern leer sind ist es die gleiche Telefonnummer.(das bleibt auch)

QuickAndDirty 15. Okt 2008 08:51

Re: Handynummer zu ordnen
 
Hab in dem Code nochmal eine Zeile geändert....
Noch ne Zeile Geändert
und deine Vorschläge eingebaut.

Dann follgendes Ergebniss

Wert Schlüssel
0049171123456 und 0171123456 stimmen überein
+49211123456 und 0211123456 stimmen überein
003906123456 und +3906123456 stimmen überein
123456 und 0211123456 sind unterschiedlich
49211123456 und 0049211123456 sind unterschiedlich
0221123456 und 0123456 sind unterschiedlich
030123456 und 0123456 sind unterschiedlich



das letzte stimmt, weil wenn man die erste Nummer als amt sieht das ganze 2 unterschiedlich nummern sind.

Die Oben gepostete Funktion müsste so wie sie jetzt ist funktionieren.

Jetzt brauche ich eine Liste mit Nationalen exitcodes. Um es rund zu machen.

nahpets 15. Okt 2008 09:22

Re: Handynummer zu ordnen
 
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:
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
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.

QuickAndDirty 15. Okt 2008 09:28

Re: Handynummer zu ordnen
 
OK die meisten Fehler haben wir jetzt beide entfernt... Den nationalen Exitcode parameter schreibe ich bei dir ab...
dann hab ich noch einen zusätzlichen Filter drauf gepackt...
Stell die Funktion in diesen Post wenn ich den NationalenExitCode hinzugefügt habe.

P.S.: Also Grundlage um über Probleme Nachzudenken nehme ich öfter mal einen Schnellschuss und verändere ihn so lange bis ich es verstehe.

Delphi-Quellcode:
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.

nahpets 15. Okt 2008 09:34

Re: Handynummer zu ordnen
 
Zitat:

Zitat von QuickAndDirty
P.S.: Also Grundlage um über Probleme Nachzudenken nehme ich öfter mal einen Schnellschuss und verändere ihn so lange bis ich es verstehe.

Nennt man wohl iterativen Prozess, mach' ich in der Regel auch so, auch wenn's mal was dauert :wink:

QuickAndDirty 15. Okt 2008 09:48

Re: Handynummer zu ordnen
 
Ok die Funktion hat jetzt 'nen modischen Filter bekommen und
du hast vergessen den NationalExitCode umzudrehen.

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!

Ach ja, das mit der Vorwahl 0 ist keine allgemeine Regel wie man an den NANPA Codes sieht,
Wenn der nationalexitcode=00 ist, die Regel mit der 0 gelten...denke ich...

miwi 15. Okt 2008 10:29

Re: Handynummer zu ordnen
 
Zum Einen würde ich auch den Vergleich "umdrehen" und von hinten nach vorne vergleichen. Alternativ kannst du ja auch erstmal auf das vorhandensein von Ländercodes (00 oder +) testen und die dann eliminieren. Das ganze kannst du dann auch noch relativ leicht testen, indem du irgendeinen Voip-Anschluss hernimmst und den die SenderID's faken läßt.

QuickAndDirty 15. Okt 2008 10:47

Re: Handynummer zu ordnen
 
Zitat:

Zitat von miwi
Zum Einen würde ich auch den Vergleich "umdrehen" und von hinten nach vorne vergleichen.

Genau das ist implementiert über "ReverseString"
Zitat:

Zitat von miwi
Alternativ kannst du ja auch erstmal auf das vorhandensein von Ländercodes (00 oder +) testen und die dann eliminieren. Das ganze kannst du dann auch noch relativ leicht testen, indem du irgendeinen Voip-Anschluss hernimmst und den die SenderID's faken läßt.

Das ist doch bereits implementiert.

nahpets 15. Okt 2008 10:58

Re: Handynummer zu ordnen
 
Zitat:

Zitat von QuickAndDirty
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!

Wie lang kann Amt sein? Mehr als eine Stelle, wenn nein, ist Amt, wenn der Rest eins lang ist (oh' watt fürn deutsch :wink:)
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:
if RemainingAreacode = '0' then
  RemainingUnknownNumber := Copy(RemainingUnknownNumber, LastIndex, Length(RemainingUnknownNumber));
für das "Nichterkennen" verantwortlich, bin mir aber nicht sicher.

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:
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.
*)
Zwei Tests erbrachten folgende Ergebnisse:
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.

QuickAndDirty 15. Okt 2008 12:56

Re: Handynummer zu ordnen
 
Ich würde auch alle führenden Nullen der RemainingNumber Strings vor dem finalen Vergleich löschen.
Das klappt in Europa auf jeden Fall.
Aber warum sollten solche Nullen übrig bleiben?

nahpets 15. Okt 2008 13:27

Re: Handynummer zu ordnen
 
Hallo,

hab' nochmal mit dem Amt rumgespielt, egal ob es jetzt nun einstellig oder mehrstellig ist, habe den Eindruck, dass es bei der Fassung aus meinem vorigen Post, immer korrekt funktioniert, auch dann noch, wenn ich die beiden
Delphi-Quellcode:
And (CountryCode = '9400')
entferne und bei RemainingKnownNumber bzw. RemainingUnKnownNumber = 0 diese auf Leerstring setzte. Dies dürfte zur Folge haben, dass keine führenden Nullen überbleiben und die festverdrahtete Abhängigkeit für 0049 im Quelltext entfallen kann.
Die grundsätzliche Entfernung der führenden Nullen dürfte sicherlich den Vergleich vereinfachen, hat aber wohl auch Nachteile: 0 für Amt würde entfallen, 9 für Amt aber nicht, was wird bei 01 für Amt?
In Italien würde die 0 als Teil der Telefonnummer entfallen, was für Rom sicherlich zu einer ungültigen Telefonnummer führt.

Naja, da fällt mir noch war auf:

interner ExitCode = 1
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
1123456 und 01123456 stimmen überein <-- falsch

interner ExitCode = 01
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
1123456 und 01123456 stimmen überein <-- richtig

Hier habe ich momentan keine Idee, wie man diese Problem lösen kann.

QuickAndDirty 15. Okt 2008 13:45

Re: Handynummer zu ordnen
 
Also Führende nullen zu löschen ist nicht schlimm wenn zuvor Amt korrekt abgehandelt wurde.
Allerdings würde das in Italien wirklich zu gleichen Telefonnummern führen obwohl sie nicht gleich sind.
Delphi-Quellcode:
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.
//
// 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
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;
         RemainingInternExitCode: 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
    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
          RemainingKnownNumber := '';
      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
          RemainingUnknownNumber := '';
      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

{A.R. Testweise Auskommentiert
// --> 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.
}
      result := (RemainingKnownNumber = '') and (RemainingUnKnownNumber = '');
    end // if LastIndex > 0 then
    else
      result := true; // Wenn volle Übereinstimmung
  end; // if (UnknownNumber <> '') and
       //    (KnownNumber <> '') then
end;

end.
Hier habe ich mal die Amts Prüfung eingesetzt.
Wenn ich deinen Code auskommentiere erkennt er es für Italien auch, aber eben dann nicht mehr für normale Ferngespräche

Beispiel:
Amt 0
Stadt 030
Land 0049
Nationalexitcode 00

00049171123456 und 00171123456 sind unterschiedlich

nahpets 15. Okt 2008 14:26

Re: Handynummer zu ordnen
 
Hallo,

mal wieder ein Test:

interner ExitCode = 01
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0211123456 und 0049211123456 unterscheiden sich
0211123456 und +49211123456 unterscheiden sich
0049171123456789 und 0171123456789 unterscheiden sich
030123456 und 004930123456 unterscheiden sich
030123456 und +4930123456 unterscheiden sich
+4930123456 und 030123456 unterscheiden sich
004930123456 und 030123456 unterscheiden sich
004930123456 und +4930123456 stimmen überein

interner ExitCode = 01
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0211123456 und 0049211123456 unterscheiden sich
0211123456 und +49211123456 unterscheiden sich
0049171123456789 und 0171123456789 unterscheiden sich
030123456 und 004930123456 unterscheiden sich
030123456 und +4930123456 unterscheiden sich
+4930123456 und 030123456 unterscheiden sich
004930123456 und 030123456 unterscheiden sich

Habe nur das übergelassen, was meiner Meinung nach falsch ist.

Mit diesen Werten sind die Ergebnisse richtig:

interner ExitCode = 0
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

interner ExitCode = 0
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

Auf die Schnelle sieht es so aus, als würden die Ergebnisse stimmen, sofern Amt nur einstellig ist.

Dashier verblüfft mich:
interner ExitCode = 0
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
00171123456 und 00049171123456 unterscheiden sich
0171123456 und 00049171123456 stimmen überein
00049171123456 und 00171123456 unterscheiden sich

interner ExitCode = 9
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
90171123456 und 90049171123456 unterscheiden sich
0171123456 und 90049171123456 unterscheiden sich
90049171123456 und 90171123456 unterscheiden sich

Oder hapert es bei der Amtserkennung doch noch deutlich?

Hab's mal wieder mit dem Debugger versucht: für dieses Beispiel RemainingKnownNumber = 90049171123456 und RemainingUnKnownNumber = 90171123456 bleibt bei der RemainingUnKnownNumber die 09 bis zum Ende über. Es wird korrekt 654321171 auf beiden Seiten abgetrennt, dann wird bei RemainingKnownNumber die 9400 abgetrennt und anschließend die 9.
Bei der RemainingUnKnownNumber müsste vor der Prüfung auf Amt die 0 entfernt werden.

Hilft es eventuell die Amtskennung zuerst "rauszuwerfen"? Habe da momentan aber keine konkrete Idee, wo und wie das ohne Nebenwirkungen ginge.

QuickAndDirty 15. Okt 2008 14:58

Re: Handynummer zu ordnen
 
Diese Version sollte ne menge beachten,
allerdings macht sie das hier falsch
Amt 0
Ort 030
Land 0049
Exitcode 00

0049171123456 und 171123456 stimmen überein

Ich denke es währe das beste wann immer ein Amt eingestellt ist
zu fordern das in den Stammdaten kein Amt Angegeben ist. Dann kann mann direkt zu beginn auf Amt Prüfen
und dieses eliminieren...ich glaube das hattest du auch vorgeschlagen mit "Wegwerfen"?


Delphi-Quellcode:
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.

nahpets 15. Okt 2008 15:32

Re: Handynummer zu ordnen
 
Hallo,

wieder mal Testergebnisse:

interner ExitCode = 9
AreaCode = 030
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0123456 und 123456 stimmen überein
1123456 und 01123456 stimmen überein
123456 und 09123456 stimmen überein
09123456 und 123456 stimmen überein
90171123456 und 90049171123456 unterscheiden sich
0171123456 und 90049171123456 stimmen überein
90049171123456 und 90171123456 unterscheiden sich

interner ExitCode = 9
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00

bekannt und unbekannt
0123456 und 123456 stimmen überein
0123456 und 0211123456 stimmen überein
0211123456 und 0123456 stimmen überein
0049211123456 und 0123456 stimmen überein
0049171123456789 und 0171123456789 stimmen überein
1123456 und 01123456 stimmen überein
123456 und 09123456 stimmen überein
09123456 und 123456 stimmen überein
90171123456 und 90049171123456 unterscheiden sich
0171123456 und 90049171123456 stimmen überein
90049171123456 und 90171123456 unterscheiden sich

Habe wieder nur die übergelassen, die meiner Meinung nach nicht korrekt sind.

bei
interner ExitCode = 0
AreaCode = 0211
CountryCode = 0049
Nationaler ExitCode = 00
stimmen die Ergebnisse

Hierzu habe ich eine Frage:
Delphi-Quellcode:
if NonAreaPrefixCountryCodes <> nil then
Begin
  KownNumberCountryCode := RemainingKnownNumber;
  KownNumberCountryCode := StringReplace(KownNumberCountryCode,NationalExitCode,'00',[]);
  KownNumberCountryCode := ReverseString(KownNumberCountryCode); <-- muss das nicht entfallen?
end;
RemainingKnownNumber ist doch schon "rückwärts", wird KownNumberCountryCode dadurch dann nicht "vorwärts"?

Zitat:

0049171123456 und 171123456 stimmen überein
Bei dem Beispiel kann ich der Routine nicht verübeln, dass sie Nummern die für gleich hält, wir wissen zwar, dass in Germany 171 eigentlich 0171 heißen müsste, aber warum soll es keine Telefonnummer 171-irgendwas geben, das dürfte ohne Ausnahmetabellen nicht handhabbar sein.

Zitat:

Ich denke es währe das beste wann immer ein Amt eingestellt ist
zu fordern das in den Stammdaten kein Amt Angegeben ist. Dann kann mann direkt zu beginn auf Amt Prüfen
und dieses eliminieren...ich glaube das hattest du auch vorgeschlagen mit "Wegwerfen"?
Ja, der Vorschlag ist sinnvoll, der Anwender darf bei der Pflege der Daten durchaus auch ein bisserl "Gehirnschmalz" einsetzen. Das Amt mit in die Stammdaten zu pflegen, halte ich eigentlich für absurd. Stell Dir ein Unternehmen mit zig Filialen vor, jede eine eigene Telefonzentrale und jede Telefonzentrale mit einer eigenen Amtsvorwahl. Das wäre doch Horror und für unternehmensweiten Einsatz der Daten einfach nur ungeeignet.

Trotzdem befürchte ich, dass Du für das Amt nicht um eine "Doppeltbehandlung" herum kommst:

Ohne Amt: 0049030123456 mit Amt: 90049030123456
Ohne Amt: 030123456 mit Amt: 9030123456
Ohne Amt: 123456 mit Amt: 9123456
Aber: Woher die Gewissheit, dass hier 9 = Amt?
Könnte es nicht auch sein:
Ohne Amt: 9123456 mit Amt: 99123456?
Du hast ja letztlich keine Möglichkeit zu erkennen, ob die Nummer mit oder ohne Amt kommt.

[OT]So, dass muss für heute reichen, hier bei uns wird gleich die Stromversorgung repariert und ich muss jetzt unseren "Rechnerpark" runterfahren und nachher schauen, dass die Server wieder vernünftig arbeiten.[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz