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;
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 :PConseil : 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
Hello,Attention La fonction ISNumeric existe deja par défaut sous delphi :Unit: IdGlobalDetermines if a character is a numeric digit.function IsNumeric(c: char): Boolean;Parametersc: charCharacter to be examined.ReturnsBoolean - True if the character is a numeric digit.DescriptionIsNumeric 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;beginResult := True; Try StrToInt(Src); Except Result := False; end;end;++,JMP77.
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.
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 >> lol ;) moustachu >> Ce code me parait un peu bricolé... ;)Je reste à StrToFloat :P
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
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à!
Bien sûr que je plaisante les gars: faut juste voir si le 1er caractere est le signe moins !
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...
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 ;)
Je voulais dire :"for B := 1 to Length(src) do..."bien sûr, mes doigts ont dérapé !
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;
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;
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;
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... ;)
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 +
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> Vu comme ça, évidemment...Faudrait alors intituler ton source :VERIFIER SI UN NUMERO DE TELEPHONE EST VALIDEet ta fonction devrait s'appeler :function IsTelephonicNumber(src: string): bool;ou un truc dans le genre... ;)
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 : 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
Voici ma fonction pour tester les n° valides :Format International : +31-6/123.123.14.14Function 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.
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 + mieuxBon Coding...ManChesTer.
Remarquez que mon code n'est pas stricteil 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.
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! amicalementjp
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 possible01 23 ... est impossibleSi 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 !
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
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.
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.
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 598 532 membres 537 nouveaux aujourd'hui 15 439 membres club