VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE

Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
- - Dernière réponse : Jean_Elens
Messages postés
53
Date d'inscription
dimanche 29 mai 2005
Statut
Membre
Dernière intervention
16 octobre 2006
- 1 juin 2005 à 19:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29574-verifier-si-un-numero-de-telephone-est-valide

Afficher la suite 
ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6 -
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
jmp77
Messages postés
1232
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
4 -
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.
jmp77
Messages postés
1232
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
4 -
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.
cs_moustachu
Messages postés
1079
Date d'inscription
jeudi 14 novembre 2002
Statut
Membre
Dernière intervention
1 janvier 2012
-
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
ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
6 -
jmp77 >> lol ;)

moustachu >> Ce code me parait un peu bricolé... ;)
Je reste à StrToFloat :P
cs_moustachu
Messages postés
1079
Date d'inscription
jeudi 14 novembre 2002
Statut
Membre
Dernière intervention
1 janvier 2012
-
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
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
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à!
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Bien sûr que je plaisante les gars: faut juste voir si le 1er caractere est le signe moins !
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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...
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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 ;)
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
Je voulais dire :

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

bien sûr, mes doigts ont dérapé !
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
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;
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
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;
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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;
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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... ;)
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
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 +
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
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+
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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... ;)
japee
Messages postés
1803
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
7 juillet 2019
-
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...
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
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
cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
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.
cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
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.
cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
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.
Debiars
Messages postés
289
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
11 février 2018
-
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
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
8 -
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 !
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
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
cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
11 décembre 2013
-
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.
Jean_Elens
Messages postés
53
Date d'inscription
dimanche 29 mai 2005
Statut
Membre
Dernière intervention
16 octobre 2006
-
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.