VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDE

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 - 17 févr. 2005 à 12:39
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

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
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.
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
27 févr. 2005 à 15:30
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.
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
26 févr. 2005 à 22:23
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_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
26 févr. 2005 à 22:08
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 !
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
26 févr. 2005 à 15:10
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_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
20 févr. 2005 à 23:50
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.
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
20 févr. 2005 à 23:42
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 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
20 févr. 2005 à 23:23
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_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
19 févr. 2005 à 00:12
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
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
18 févr. 2005 à 19:04
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...
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
18 févr. 2005 à 18:56
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... ;)
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
18 févr. 2005 à 18:45
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+
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
18 févr. 2005 à 17:25
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 +
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
18 févr. 2005 à 16:30
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... ;)
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
18 févr. 2005 à 16:11
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;
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
18 févr. 2005 à 10:57
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;
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
18 févr. 2005 à 10:55
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;
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 févr. 2005 à 22:27
Je voulais dire :

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

bien sûr, mes doigts ont dérapé !
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 févr. 2005 à 22:25
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 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
17 févr. 2005 à 22:17
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...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
17 févr. 2005 à 15:07
Bien sûr que je plaisante les gars: faut juste voir si le 1er caractere est le signe moins !
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
17 févr. 2005 à 15:04
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_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
17 févr. 2005 à 13:09
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
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 févr. 2005 à 13:03
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
17 févr. 2005 à 12:59
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
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
17 févr. 2005 à 12:59
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.
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
17 févr. 2005 à 12:57
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.
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
17 févr. 2005 à 12:39
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
Rejoignez-nous