AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Handynummer zu ordnen
Thema durchsuchen
Ansicht
Themen-Optionen

Handynummer zu ordnen

Ein Thema von QuickAndDirty · begonnen am 13. Okt 2008 · letzter Beitrag vom 20. Okt 2008
Antwort Antwort
Seite 3 von 5     123 45      
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#21

Re: Handynummer zu ordnen

  Alt 13. Okt 2008, 16:03
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
Klaus
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#22

Re: Handynummer zu ordnen

  Alt 13. Okt 2008, 16:05
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#23

Re: Handynummer zu ordnen

  Alt 14. Okt 2008, 14:55
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 = '0then
            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 = '0then
            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 = '00then
          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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#24

Re: Handynummer zu ordnen

  Alt 14. Okt 2008, 16:05
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?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#25

Re: Handynummer zu ordnen

  Alt 14. Okt 2008, 22:42
Zitat von nahpets:
Hallo,

da warst Du ja richtig fleißig
Ja ich kann es nicht ertragen das es sowas nicht schon gibt.

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 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 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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#26

Re: Handynummer zu ordnen

  Alt 14. Okt 2008, 23:49
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)
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#27

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 08:51
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#28

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 09:22
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 = '0then // 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 = '0then
// --> 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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#29

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 09:28
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#30

Re: Handynummer zu ordnen

  Alt 15. Okt 2008, 09:34
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
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