Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Handynummer erkennen (https://www.delphipraxis.net/151789-handynummer-erkennen.html)

shmia 1. Jun 2010 17:17


Handynummer erkennen
 
Ich möchte erkennen, ob es sich bei einer Telefonnummer um eine Handynummer (mobile phone number) handelt.
Dazu habe ich mir folgende Code zusammengebaut:
Delphi-Quellcode:
function IsMobilePhoneNumber(x:string):Boolean;
const
   vorwahl_DE: array[0..16] of string =
   (
      // T-Mobile
      '151', '160', '170', '171', '175',
      // vodafone
      '152', '162', '172', '173', '174',
      // E-Plus
      '157', '163', '177', '178',
      // O2
      '159', '176', '179'  );
var
   p1 : Integer;
begin
   x := StrRemoveChars(x, [' ','P','-']); // Störzeichen entfernen
   if x = '' then
   begin
      Result := False;
      Exit;
   end;

   // Nummer mit diesem Aufbau behandeln
   // +xx(0)170yyyyyyy
   if x[1] = '+' then
   begin
      // die (0) rausschneiden
      p1 := Pos('(0)', x);
      if (p1 > 1) then
         Delete(x, p1, 3);
   end;

   if x[1] ='0' then
      Result := StrHasPrefix(Copy(x, 2, 10), vorwahl_DE)
   else if StrHasPrefix(x, ['+49']) then
   begin
      Result := StrHasPrefix(Copy(x, 4,10), vorwahl_DE);
   end
   else
      Result := False;
end;
Irgendwelche Ideen, was man noch verbessern könnte?
Oder wie man auch Handynummern im europäischen Ausland erkennen kann?


Die Funktionen StrRemoveChars() und StrHasPrefix() stammen aus der JCL.
Ich reiche sie hier mal nach für den Fall, dass jemand den Code ohne JCL testen möchte:
Delphi-Quellcode:
function StrRemoveChars(const S: string; const Chars: TSysCharSet): string;
var
  Source, Dest: PChar;
  Len, Index: Integer;
begin
  Len := Length(S);
  SetLength(Result, Len);
  UniqueString(Result);
  Source := PChar(S);
  Dest := PChar(Result);
  for Index := 0 to Len-1 do
  begin
    if not (Source^ in Chars) then
    begin
      Dest^ := Source^;
      Inc(Dest,SizeOf(Char));
    end;
    Inc(Source,SizeOf(Char));
  end;
  SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(Char));
end;
function StrPrefixIndex(const S: string; const Prefixes: array of string): Integer;
var
  I: Integer;
  Test: string;
begin
  Result := -1;
  for I := Low(Prefixes) to High(Prefixes) do
  begin
    Test := StrLeft(S, Length(Prefixes[I]));
    if AnsiSameText(Test, Prefixes[I]) then
    begin
      Result := I;
      Break;
    end;
  end;
end;
function StrHasPrefix(const S: string; const Prefixes: array of string): Boolean;
begin
  Result := StrPrefixIndex(S, Prefixes) > -1;
end;

toms 1. Jun 2010 18:03

Re: Handynummer erkennen
 
Wunsch:
Erkennung von Schweizer Handynummern: 076 XXX XX XX, 077 XXX XX XX, 078 XXX XX XX, 079 XXX XX XX

Flips 1. Jun 2010 18:06

Re: Handynummer erkennen
 
http://www.gottwals.com/europaeische...vorwahlen.html

Muellermilchtrinker 1. Jun 2010 18:15

Re: Handynummer erkennen
 
vielleicht Rüchgabe des Anbieters.
Ach und "0176" gehört auch zu FONIC.
Fonic gehört zu o2

himitsu 1. Jun 2010 18:22

Re: Handynummer erkennen
 
Irgendwo hab ich eigentlich 'ne RegExp dafür rumliegen, aber ich fand sie grade nicht so auf die Schnelle. (aber Google hilft bestimmt notfalls aus)

Nja, warum löschst du denn hier fleißig in den Strings rum und läßt es nicht einfach soeine schöne RegExp erledigen?

Meflin 1. Jun 2010 18:27

Re: Handynummer erkennen
 
Zitat:

Zitat von Muellermilchtrinker
vielleicht Rüchgabe des Anbieters.
Ach und "0176" gehört auch zu FONIC.
Fonic gehört zu o2

Heutzutage kannst du doch sowieso vergessen, über die Vorwahl auf den Anbieter schließen zu wollen :gruebel: - ich habe meine Nummer mittlerweile zwischen drei Netzanbietern gewechselt... (Vodafone -> T-Mobile -> o2, und die Vorwahl is immernoch die gleiche :mrgreen: )

Sharky 1. Jun 2010 18:29

Re: Handynummer erkennen
 
Zitat:

Zitat von Muellermilchtrinker
vielleicht Rüchgabe des Anbieters. ...

Hmmm...

das ist doch garnicht möglich. Oder?
Du kannst ja nicht wissen wer mein Anbieter ist nur weil ich eine bestimmte Nummer habe.

@shima: In England gibt es diese unter anderem diese Vorwahlen für Mobilephones:

+44 (7824)
+44 (7590)
+44 (7734)

H4ndy 1. Jun 2010 18:37

Re: Handynummer erkennen
 
inc(RegExVorschlag) von himitsu.
Ist wahrscheinlich komfortabler und einfach zu warten wenn du einmal das richtig RegEx raus hast.
Und wegen den Vorwahlen: Da kann man echt nicht mehr dran fest machen, welcher Anbieter das ist. Durch Rufnummernmitnahme voellig irrelevant geworden.

Uebrigens kann man bei einigen Laendern (z.B. USA) nicht erkennen, ob es sich um einen Mobilfunk oder Festnetznummer handelt.

shmia 1. Jun 2010 18:41

Re: Handynummer erkennen
 
Regular Expressions wäre natürlich auch eine Möglichkeit...

Naja hier mal die Version, die auch die Schweizer und Österreicher Handyvorwahlen erkennt.
Der Rest wäre dann Fleissarbeit.
Delphi-Quellcode:
function IsMobilePhoneNumber(x:string):Boolean;
const
   vorwahl_DE: array[0..19] of string =
   (
      // T-Mobile
      '151', '160', '170', '171', '175',
      // vodafone
      '152', '162', '172', '173', '174',
      // E-Plus
      '157', '163', '177', '178',
      // O2
      '159', '176', '179',
      // Rest (simyo, Group 3G,..)
      '150', '161', '164'
         );
   vorwahl_CH: array[0..3] of string =
   ( '76', '77', '78', '79' );

   vorwahl_AT: array[0..18] of string =
   ( '650','651','652','653','655','657','659','660','661','663',
   '664','665','666','667','668','669', '67','68','69' );

   vorwahl_GB: array[0..2] of string =
   ( '7824', '7590', '7734' );
var
   p1 : Integer;
begin
   x := StrRemoveChars(x, [#10,#13,#9,' ','P','-', ',']); // Störzeichen entfernen
   if x = '' then
   begin
      Result := False;
      Exit;
   end;

   // Nummer mit diesem Aufbau behandeln
   // +49(0)170xxxxxxx
   if x[1] = '+' then
   begin
      // die (0) rausschneiden
      p1 := Pos('(0)', x);
      if (p1 > 1) then
         Delete(x, p1, 3);
   end;

   // Falls die Nummer diesen Aufbau hat
   // (0170)xxxxxxx
   // dann die Klammern entfernen
   if x[1] = '(' then
      x := StrRemoveChars(x, ['(',')']);


   case StrPrefixIndex(x, ['+49', '+41', '+43','+44']) of
      0: // Deutscheland
         Result := StrHasPrefix(Copy(x, 4,10), vorwahl_DE);
      1: // Schweiz
         Result := StrHasPrefix(Copy(x, 4,10), vorwahl_CH);
      2: // Österreich
         Result := StrHasPrefix(Copy(x, 4,10), vorwahl_AT);
      3: // vereinigtes Königreich
         Result := StrHasPrefix(Copy(x, 4,10), vorwahl_GB);
   else
      if x[1] ='0' then
         Result := StrHasPrefix(Copy(x, 2, 10), vorwahl_DE)
      else
         Result := False;
   end;
end;

RWarnecke 1. Jun 2010 19:49

Re: Handynummer erkennen
 
Da fehlen noch ein paar deutsche Handyvorwahlen, siehe hier.Hier noch ein Link für die Fleißarbeit mit allen Handyvorwahlen national und international.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 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