begin process at 2010 02 09 19:29:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Texte

 > VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE

VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE


 Information sur la source

Note :
7 / 10 - par 3 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Texte Niveau :Débutant Date de création :17/02/2005 Date de mise à jour :18/02/2005 20:55:30 Vu :18 897

Auteur : sosodef88

Ecrire un message privé
Commentaire sur cette source (28)
Ajouter un commentaire et/ou une note

 Description

Voila une fonction qui vérifie un numéro de téléphonne de 10 chiffre contient uniquement des chiffres

Source

  • function IsTelValide(src:string):bool;
  • const Num = '0123456789'; var B:integer;
  • begin
  • for B := 1 to 10 do
  • if pos(copy(src,b,1), num) = 0 then
  • begin
  • result := false;
  • exit;
  • end
  • else
  • result := true;
  • end;
function IsTelValide(src:string):bool;
  const Num = '0123456789'; var B:integer;
begin
for B := 1 to 10 do
  if pos(copy(src,b,1), num) = 0 then
    begin
      result := false;
      exit;
    end
  else
    result := true;
end;

 Conclusion

Si on peut améliorer le code ou s'il existe un manière plus simple d'y arriver veullez m'en faire pare svp


 Historique

18 février 2005 20:55:31 :
18/02: j'ai mus un titre plus approprié

 Sources du même auteur

INSTRREV

 Sources de la même categorie

Source avec Zip COMBINAISONS DE STRINGS par askil2000
Source avec Zip Source avec une capture RECONNAISSANCE DE CARACTÈRES (OCR) par Bacterius
Source avec Zip Source avec une capture NETTOYAGE AUTOMATIQUE DE NOMS DE FICHIERS par John Dogget
DISTANCE DE JARO-WINKLER par PoulpHunter
Source avec Zip BASE DE DONNÉE WIKI par thithony

Commentaires et avis

Commentaire de ni69 le 17/02/2005 12:39:14

Tu peux faire aussi comme ça :

function IsNumeric(scr:string):Boolean;
begin
  result := true;
  try
    StrToFloat(scr); // utilisation de Float pour la détection de nombres à virgule ;)
  except
    result := false
  end;
end;

Malgré tout, ta fonction a l'avantage de pouvoir être utilisée dans l'EDI malgré le compilateur. En effet, ce que je te propose ne marche qu'en dehors de l'EDI, dans un prog déjà compilé, sans les alertes du compilateur dues à except :P
Conseil : ce serait bien que tu rajoutes la détection de la virgule dans ta chaîne de caractères pour permettre de faire des tests avec des extended :)

@+
Nico

Commentaire de jmp77 le 17/02/2005 12:57:09

Hello,

Attention La fonction ISNumeric existe deja par défaut sous delphi :

Unit: IdGlobal

Determines if a character is a numeric digit.


function IsNumeric(c: char): Boolean;

Parameters

c: char

Character to be examined.


Returns

Boolean - True if the character is a numeric digit.


Description

IsNumeric is a Boolean function that indicates if the character in c contains a numeric digit in the range '0'..'9'.

Sinon moi je ferrais ceci :
function IsInteger(src:string):bool;

begin
Result := True;

   Try
   StrToInt(Src);
   Except
   Result := False;
   end;
end;

++,
JMP77.

Commentaire de jmp77 le 17/02/2005 12:59:02

Oups désolé Ni69 mais j'avais ouvert la source et j'etais partis a autre chose et je n'avais pas vu ton commentaire au moment ou j'ai posté.

Mais les grands esprits se rencontre a ce que je vois lol.

Commentaire de moustachu le 17/02/2005 12:59:06

ou comme ça aussi
  Function IsNumeric(p_varIn: Variant) : Boolean;
  var
    intCode: Integer;
    extValue: Extended;
  begin
    // Si le variant est de type String
    if VarIsStr(p_varin) then
    begin
      // Test si peut correspondre à Extended
       val(p_varIn, extValue, intCode);
       // Si code=0 -> p_varIn est "extended"
       Result := (intCode = 0);
    end else begin
      // Test Si variant est numérique
      result := VarIsNumeric(p_varin);
    end;
  end;

Ca te permet de savoir si ton nombre est numérique (dont nombre à virgule).

++
Moustachu

Commentaire de ni69 le 17/02/2005 13:03:10

jmp77 >> lol ;)

moustachu >> Ce code me parait un peu bricolé... ;)
Je reste à StrToFloat :P

Commentaire de moustachu le 17/02/2005 13:09:36

Houlaaa, j'avais pas que j'étais à la traine dans ma réponse, je devais faire autre chose aussi.

Oui effectivement ça fait un peu bricoler, mais comme là où je suis ils ne veulent pas de try/except.... allez savoir

++
Moustachu

Commentaire de MAURICIO le 17/02/2005 15:04:43

Piti problème (je la fait à la Homer là ...): si je passe la string '' !!!
Faudrait inicialiser ta fonction à False. Ok?
Malheureusement, ta fonction ne détecte pas non plus le signe moins alors que -5 est bien une valeur numerique !
Appelle ta fonction IsWord et voilà!

Commentaire de MAURICIO le 17/02/2005 15:07:39

Bien sûr que je plaisante les gars: faut juste voir si le 1er caractere est le signe moins !

Commentaire de japee le 17/02/2005 22:17:21 administrateur CS

Oh la la...

Personne ne l'a testée ou quoi, cette fonction ?

Et alors, sosodef88, toi non plus on dirait !

Ca ne peut pas fonctionner, le résultat sera toujours false si chaîne à tester < 10.
Par exemple : '581' donne False,
et Length(String) > que 10 : '1345674488KO' donne True !!!

Explications :

Si la longueur du string est inférieure à 10, ça va continuer à "boucler" et forcément, pos = 0 donc Result := False, CQFD.
Au contraire, si length du string >= 10, ça va s'arrêter à B := 10 et Result := True, forcément.

Un dépannage :

function IsNumeric(src: string): bool;
const Num = '0123456789';
var B: integer;
begin
  Result := true;
  for B := 1 to 10 do
  begin
    if pos(copy(src, B, 1), num) = 0 then
      Result := false;
      Exit;
  end;
end;

mais l'approche ne me plait pas trop...

Commentaire de japee le 17/02/2005 22:25:35 administrateur CS

Et encore, non, ma fonction peut être fausse également, si la longueur du String à tester dépasse 10, évidemment !

Genre : '123456789OK'

Non, il faut envisager une approche complètement différente, où tu ne fais pas une boucle par rapport à '0123456789', mais par rapport à la longueur de la chaîne à tester :
for B := 1 to Length(b) do...

Bonne continuation ;)

Commentaire de japee le 17/02/2005 22:27:14 administrateur CS

Je voulais dire :

"for B := 1 to Length(src) do..."

bien sûr, mes doigts ont dérapé !

Commentaire de MAURICIO le 18/02/2005 10:55:53

Oui! evidemment!
Des fois c' est tellement gros qu' on voit pas !
Mais tu as tord d' inicialiser RESULT à True Japee: imagine que la chaine est vide !

function IsNumeric(src: string): bool;
const Num = '0123456789';
var B: integer;
begin
  Result := false;
  if length(src) > 0 then begin
    RESULT := (src[1] = '-') or (pos(src[1], num) <> 0);
    for B := 2 to length(src) do
    begin
      if pos(src[1], num) = 0 then
        Result := false;
        Exit;
    end;
  end;
end;

Commentaire de MAURICIO le 18/02/2005 10:57:51

Il y a une erreur: mon doigt a glissé ! Decidemment ...

function IsNumeric(src: string): bool;
const Num = '0123456789';
var B: integer;
begin
  Result := false;
  if length(src) > 0 then begin
    RESULT := (src[1] = '-') or (pos(src[1], num) <> 0);
    for B := 2 to length(src) do
    begin
      if pos(src[B], num) = 0 then
        Result := false;
        Exit;
    end;
  end;
end;

Commentaire de japee le 18/02/2005 16:11:19 administrateur CS

Exact, Mauricio, j'avais oublié la chaîne vide...  >:(

Voici ma version, qui n'apporte rien de plus que la tienne, mais qui utilise une spécificité de Delphi (je crois ?), les ensembles énumérés :

function IsNumeric(Src: String): Bool;
var B: Integer;
begin
  Result := False;
  if (Src = '') or (not (Src[1] in ['-', '0'..'9'])) then Exit;
  for B := 2 to Length(Src) do
    if not (Src[B] in ['0'..'9']) then Exit;
  Result := True;
end;

Commentaire de japee le 18/02/2005 16:30:09 administrateur CS

Ouais, et puis aussi, je veux pas cafter, je ne citerai donc pas ni69 et jpm77, mais eux non plus ils n'ont pas tenu compte de la chaîne vide dans leur code, non mais, c'est vrai, quoi... c'est toujours les mêmes qui trinquent ! snif...

Et l'auteur du source non plus, il l'a pas fait, na !

Non mais...  ;)

Commentaire de sosodef88 le 18/02/2005 17:25:20

Veuillez m'excuser j'utilisais cette source pour un programme qui permet d'envoyer des texto (le num de phone) et par conséquent je mettais:  if length(var) < 10 then ....... puisque qu'il y a toujours 10 numéro dans un num gsm ......

bonne journée a +

Commentaire de MAURICIO le 18/02/2005 18:45:18

Et moi qui croyait qu' on pouvait pas faire:
  if (Str = '') or (not (Str[1] in ['-', '0'..'9']))
parce que la chaine peut etre vide et que donc Str[1] allait provoquer une erreur ?!!! Donc, le système teste bien Str='' avant de tester l' autre condition. Arg, j' y crois pas ...

Attention tout de meme parce que :
  if (Str <> '') or (not (Str[1] in ['-', '0'..'9']))
Là, ça marche pas evidemment, pinaise (haa ce Homer)!

Sinon Sosodef88: utilise des génériques !!! Non, je parle pas de médicaments mais des fonctions !
J' explique: si tu crées une fonction IsNumeric, elle pourra fonctionner dans d' autres programmes, tu me suis là? donc, il faut que tu testes si la chaine est vide. Comme ça, tu auras une fonction 100% utilisable !!!
A+

Commentaire de japee le 18/02/2005 18:56:16 administrateur CS

sosodef88> Vu comme ça, évidemment...

Faudrait alors intituler ton source :

VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE

et ta fonction devrait s'appeler :

function IsTelephonicNumber(src: string): bool;

ou un truc dans le genre...  ;)

Commentaire de japee le 18/02/2005 19:04:21 administrateur CS

Ouais, Mauricio, question intéressante !

Avec l'opérateur "or", je crois que Delphi teste d'abord le premier terme de l'expression, et s'il est True, n'estime pas utile de tester le deuxième, puisque c'est suffisant pour que la condition soit valide.

On peut changer cet état de fait avec une directive de compilation, je ne sais pas laquelle.

Sinon, c'est bien pratique...

Commentaire de Delphiprog le 19/02/2005 00:12:01 administrateur CS

Japee : regarde dans les options du projet, onglet "Compilateur" : évaluation booléenne complète.

Et dire qu'en utilisant les expressions régulières tout serait si simple. Exemple pour un numéro de téléphone au format international, tester la chaine avec le pattern : (\+\d *)?(\(\d+\) *)?(\d+(-\d*)*)

Ben oui, un n° de téléphone français peut aussi être exprimé en précisant le préfixe à l'internationale. Dans ce cas, il fait plus de dix chiffres !

Pour ceux que seraient intéressés, allez voir : http://www.regexlib.com

Commentaire de ManChesTer le 20/02/2005 23:23:15 administrateur CS

Voici ma fonction pour tester les n° valides :

Format International : +31-6/123.123.14.14

Function isValidPhoneNumber(N:String):Boolean;
Var   PhoneInNum : Int64;
      Code,Value : Integer;

begin
Result:=False;
Code:=Length(n);
if Length(N)>0 then
begin
  if n[1]='+' then
  begin
   delete(n,1,1);
   dec(code);
  end;
  For Value:=0 to Code do
   if n[Value] in ['-','/','.'] then
    n[Value]:='0';
end;
Val(N,PhoneInNum,Code);
if (code<>0) or (PhoneInNum=0) then
begin
  SetLastError(1781);
  Exit;
end;
Result:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if isValidPhoneNumber(Edit1.Text) then
  Showmessage('Numèro Valide')
else
  Showmessage(SysErrorMessage(GetLastError));
end;

Bon Coding...

ManChesTer.

Commentaire de ManChesTer le 20/02/2005 23:42:24 administrateur CS

oupps le bo bug...

Function isValidPhoneNumber(N:String):Boolean;
Var   PhoneInNum : Int64;
      Code,Value : Integer;

begin
Result:=False;
Code:=Length(n);
if Length(N)>0 then
begin
  if n[1]='+' then
  begin
   delete(n,1,1);
   dec(code);
  end;
  For Value:=1 to Code do
   if n[Value] in ['-','/','.'] then
    n[Value]:='0';
end;
Val(N,PhoneInNum,Code);
if (code<>0) or (PhoneInNum=0) then
begin
  SetLastError(1781);
  Exit;
end;
Result:=True;
end;

La c'est + mieux

Bon Coding...

ManChesTer.

Commentaire de ManChesTer le 20/02/2005 23:50:54 administrateur CS

Remarquez que mon code n'est pas stricte

il permet d'accepter par exemple 101, 1391, +32/0800.24.25 ou encore 24.12.23 qui peuvent etre des numéro valides....

à vous de tester les valuers que vous voulez exclure, par exemple les répétitions genre 00.01.01.01, mais attention le 80.01.01, et les exemples ci dessus sont possibles donc prudence ....

Bon Coding...

ManChesTer.

Commentaire de Debiars le 26/02/2005 15:10:58

lol les gars,
ça me rappelle ma jeunesse, quand nous discutions de la meilleure façon de tester la validité d'une date...

Au fait,  pourriez essayer, pas!

amicalement

jp

Commentaire de grandvizir le 26/02/2005 22:08:31

Y'aurait plus sophistiqué comme processus. Sur une doc de France Telecom, on pouvait lire que certaines combinaisons de chiffres sont impossibles. Exemples tirés du hasard:
01 49 ... est possible
01 23 ... est impossible

Si c'est pour vérifier une saisie, autant prendre directement TMaskEdit en mode numéro de téléphone et on n'en parle plus.

japee> Please, ne dit rien... Pas d'interprétations virtuelles !

Commentaire de sosodef88 le 26/02/2005 22:23:32

grandvizir> ce serai pas une sorte d'algo dont tu parle pour vérifier la validité du num?

ps: il faut savoir ke je suis en belgique et j'utilise ce code pour uniquement les numéro qui commence par 047 - 048 - 049. Donc cette fonction me suffisais largement

Commentaire de ManChesTer le 27/02/2005 15:30:20 administrateur CS

Grandvizir tu lis les post ?

Il n'y a pas que "France Telecom" qui attribue des n°de téléphonne dans le monde, le 1234 est un numéro valide en belgique et certainement dans bien d'autres pays, d'autre part, avec la libèralisation des télécoms, qui sais ce que rèserve l'avenir. Si toi tu sais, alors change de nick pour "Mme Irma".

Bon Coding...

ManChesTer.

Commentaire de Jean_Elens le 01/06/2005 19:56:40

le composant "microsoft masked edit control 6.0" fait la même chose sans probleme, sans alourdir mon code, ... bref l'ideal avec bien plus de possibilités.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales