VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE

Signaler
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
-
Messages postés
53
Date d'inscription
dimanche 29 mai 2005
Statut
Membre
Dernière intervention
16 octobre 2006
-
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

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.
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.
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
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
14
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 !
Messages postés
285
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
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.
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.
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.
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
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
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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...
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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... ;)
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+
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 +
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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... ;)
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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;
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;
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;
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
Je voulais dire :

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

bien sûr, mes doigts ont dérapé !
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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 ;)
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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...
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 !
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à!
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
jmp77 >> lol ;)

moustachu >> Ce code me parait un peu bricolé... ;)
Je reste à StrToFloat :P
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
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
5
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.
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
5
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.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
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