OVH Cloud OVH Cloud

Variable de type réel

11 réponses
Avatar
Gassane
Bonjour,

Voilà un certain temps que je recherche la solution à ce problème :
Comment vérifier qu'une variable issue d'une zone de texte est de type réel.
J'ai essayé de résoudre mon problème avec VarType() mais la fonction
interprète l'argument comme étant une chaine de caractère.

Si je fais Vartype(Val(text1.text)) cela retourne 5 même si la valeur de la
variable estde type entier.


PB...........

Aurriez-vous une solution à ce problème ? Merci.

10 réponses

1 2
Avatar
Gloops
Bonjour,

As-tu essayé IsNumeric ?

Pour les entiers ça marche bien.

Après on pourrait regarder du côté de Like, mais je n'ai pas trouvé la
bonne "expression régulière" à fournir derrière.
En désespoir de cause on pourrait l'émuler par une fonction perso.
En espérant qu'il n'y ait pas besoin.

______________________________________
Gassane a écrit, le 19/10/2004 11:25 :

Bonjour,

Voilà un certain temps que je recherche la solution à ce problème :
Comment vérifier qu'une variable issue d'une zone de texte est de type réel.
J'ai essayé de résoudre mon problème avec VarType() mais la fonction
interprète l'argument comme étant une chaine de caractère.

Si je fais Vartype(Val(text1.text)) cela retourne 5 même si la valeur de la
variable estde type entier.


PB...........

Aurriez-vous une solution à ce problème ? Merci.



Avatar
Patrice Henrio
A priori un entier est aussi un réel, plus précisément il est toujours
possible de transcoder un entier en réel mais pas l'inverse.
En algorithmique, un réel c'est un nombre avec une partie décimale non nulle
(quelle que soit la base de numération) et un entier c'est donc un nombre
dont la partie déciamle est nulle.
En VB (et dans d'autres langages) un réel ou un entier c'est un nombre codé
sur un certain nombre de bits et d'une certaine manière (donc une valeur
pour dire le type, et des octets contenant la valeur à traduire ensuite
grâce au code). C'est d'abord le type qui détermine le nombre d'octets et le
codage du nombre.
Par contre si on utilise IsNumeric pour savoir si la chaïne alphanumérique
ne comporte que des caractères numériques, on peut complèter par la partie
décimale pour savoir si le nombre peut être traduit en entier ou non.
Par contre pour IsNumeric, selon la version que l'on a, le point décimal est
reconnu ou non.
"Gassane" a écrit dans le message de
news:
Bonjour,

Voilà un certain temps que je recherche la solution à ce problème :
Comment vérifier qu'une variable issue d'une zone de texte est de type
réel.
J'ai essayé de résoudre mon problème avec VarType() mais la fonction
interprète l'argument comme étant une chaine de caractère.

Si je fais Vartype(Val(text1.text)) cela retourne 5 même si la valeur de
la
variable estde type entier.


PB...........

Aurriez-vous une solution à ce problème ? Merci.



Avatar
ng
Salut,

La propriété .Text n'est pas de type numérique (string...), il fadura passer
par une autre variable puis controler l'erreur ou vérifier si les données
peuvent être converties (Isnumeric() comme conseillée par Gloops) :

Dim dwNb As Long
If IsNumeric(Text1.Text) Then dwNb = CLng(dwNb) '//CInt() pour un integer,
CDbl() pour un double... ou plus généralementr Val()...

Attention toutefois à cette fonction, elle bugue, voici une fonction qui
fonctionne (de Rick Rothstein modifiée par Zoury :)) :

Function IsDigitsOnly(Value As String) As Boolean
IsDigitsOnly = Not Value Like "*[!0-9]*"
End Function

Function IsNumber(ByVal Value As String) As Boolean
' Leave the next statement out if you don't
' want to provide for plus/minus signs
Dim sDecimal As String
sDecimal = GetDecimalNotation
If Value Like "[+-]*" Then Value = Mid$(Value, 2)
IsNumber = Not Value Like "*[!0-9" & sDecimal & "]*" And _
Not Value Like "*" & sDecimal & "*" & sDecimal & "*"
And _
Len(Value) > 0 And Value <> sDecimal And _
Value <> vbNullString
End Function

Function GetDecimalNotation() As String
GetDecimalNotation = Mid$(CStr(0.1), 2, 1)
End Function



Il suffit de faire :

Dim dwNb As Long
If IsNumber(Text1.Text) Then dwNb = CLng(dwNb) '//CInt() pour un integer,
CDbl() pour un double... ou plus généralementr Val()...

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gassane wrote:
Bonjour,

Voilà un certain temps que je recherche la solution à ce problème :
Comment vérifier qu'une variable issue d'une zone de texte est de
type réel. J'ai essayé de résoudre mon problème avec VarType() mais
la fonction interprète l'argument comme étant une chaine de caractère.

Si je fais Vartype(Val(text1.text)) cela retourne 5 même si la valeur
de la variable estde type entier.


PB...........

Aurriez-vous une solution à ce problème ? Merci.


Avatar
ng
Salut,

Attention toutefois à IsNumeric, en effet elle est connu pour buguer, voici
une fonction qui fonctionne (de Rick Rothstein modifiée par Zoury :)) :

Function IsDigitsOnly(Value As String) As Boolean
IsDigitsOnly = Not Value Like "*[!0-9]*"
End Function

Function IsNumber(ByVal Value As String) As Boolean
' Leave the next statement out if you don't
' want to provide for plus/minus signs
Dim sDecimal As String
sDecimal = GetDecimalNotation
If Value Like "[+-]*" Then Value = Mid$(Value, 2)
IsNumber = Not Value Like "*[!0-9" & sDecimal & "]*" And _
Not Value Like "*" & sDecimal & "*" & sDecimal & "*"
And _
Len(Value) > 0 And Value <> sDecimal And _
Value <> vbNullString
End Function

Function GetDecimalNotation() As String
GetDecimalNotation = Mid$(CStr(0.1), 2, 1)
End Function



Il suffit de faire :

Dim dwNb As Long
If IsNumber(Text1.Text) Then dwNb = CLng(dwNb) '//CInt() pour un integer,
CDbl() pour un double... ou plus généralementr Val()...

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gloops wrote:
Bonjour,

As-tu essayé IsNumeric ?

Pour les entiers ça marche bien.

Après on pourrait regarder du côté de Like, mais je n'ai pas trouvé la
bonne "expression régulière" à fournir derrière.
En désespoir de cause on pourrait l'émuler par une fonction perso.
En espérant qu'il n'y ait pas besoin.

______________________________________
Gassane a écrit, le 19/10/2004 11:25 :

Bonjour,

Voilà un certain temps que je recherche la solution à ce problème :
Comment vérifier qu'une variable issue d'une zone de texte est de
type réel. J'ai essayé de résoudre mon problème avec VarType() mais
la fonction interprète l'argument comme étant une chaine de
caractère. Si je fais Vartype(Val(text1.text)) cela retourne 5 même si la
valeur de la variable estde type entier.


PB...........

Aurriez-vous une solution à ce problème ? Merci.




Avatar
scraper
Bonjour ng
(dans news:)
tu nous disais :

Salut,

Attention toutefois à IsNumeric, en effet elle est connu pour buguer,




ah ? :-(

peux tu développer un peu, STP ?

merci




--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
ng
Salut,
http://groups.google.fr/groups?q=isnumeric+group:*fr.vb*+author:Zoury&hl=fr&lr=&selm=OfNoq1ZCDHA.2396%40TK2MSFTNGP12.phx.gbl&rnum=3

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

scraper wrote:
Bonjour ng
(dans news:)
tu nous disais :

Salut,

Attention toutefois à IsNumeric, en effet elle est connu pour buguer,




ah ? :-(

peux tu développer un peu, STP ?

merci


Avatar
Gloops
Salut,

Effectivement, tout-à-l'heure j'ai fait le test avec
IsNumeric("($1 23 3,4 5 E67$)")
et ça renvoyait effectivement vrai, ce qui ne me choquait pas plus que
ça, même si il faudrait quand même se mettre à plusieurs pour gagner ça,
mais après avoir fait quelques autres tests je refais celui-ci et cette
fois ça me renvoie faux.

Avoir une réponse différente sur la même chaîne, c'est vrai que ça c'est
embêtant, surtout en n'ayant a priori aucune idée sur ce qui a pu
changer la réponse en dix minutes.

Il existe bien des "expressions régulières" à tester avec Like, mais à
moins que j'aie mal lu, en VB on ne sait pas tester ainsi un nombre
quelconque de chiffres, comme en Java on dirait "[0-9]*"

Function EauTiede(Flotte As Numeric)
Select Case ChaudPasChaud(Flotte)
Case vbTropChaud
EauTiede = MoinsChaud(Flotte)
Case vbTropFroid
EauTiede = MoinsFroid(Flotte)
Case Else
EauTiede = Flotte
End Select
End Function
_________________________________
ng a écrit, le 19/10/2004 21:42 :

Salut,
http://groups.google.fr/groups?q=isnumeric+group:*fr.vb*+author:Zoury&hl=fr&lr=&selm=OfNoq1ZCDHA.2396%40TK2MSFTNGP12.phx.gbl&rnum=3



Avatar
ng
Non en effet cela ne fonctionne pas avec Like, il faudrait utiliser des
classes RegEx plus complexes, sinon elle ne te plait pas cette fonction ? :

Function IsNumber(ByVal Value As String) As Boolean
' Leave the next statement out if you don't
' want to provide for plus/minus signs
Dim sDecimal As String
sDecimal = GetDecimalNotation
If Value Like "[+-]*" Then Value = Mid$(Value, 2)
IsNumber = Not Value Like "*[!0-9" & sDecimal & "]*" And _
Not Value Like "*" & sDecimal & "*" & sDecimal & "*"
And _
Len(Value) > 0 And Value <> sDecimal And _
Value <> vbNullString
End Function

Function GetDecimalNotation() As String
GetDecimalNotation = Mid$(CStr(0.1), 2, 1)
End Function

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gloops wrote:
Salut,

Effectivement, tout-à-l'heure j'ai fait le test avec
IsNumeric("($1 23 3,4 5 E67$)")
et ça renvoyait effectivement vrai, ce qui ne me choquait pas plus que
ça, même si il faudrait quand même se mettre à plusieurs pour gagner
ça, mais après avoir fait quelques autres tests je refais celui-ci et
cette fois ça me renvoie faux.

Avoir une réponse différente sur la même chaîne, c'est vrai que ça
c'est embêtant, surtout en n'ayant a priori aucune idée sur ce qui a
pu changer la réponse en dix minutes.

Il existe bien des "expressions régulières" à tester avec Like, mais à
moins que j'aie mal lu, en VB on ne sait pas tester ainsi un nombre
quelconque de chiffres, comme en Java on dirait "[0-9]*"

Function EauTiede(Flotte As Numeric)
Select Case ChaudPasChaud(Flotte)
Case vbTropChaud
EauTiede = MoinsChaud(Flotte)
Case vbTropFroid
EauTiede = MoinsFroid(Flotte)
Case Else
EauTiede = Flotte
End Select
End Function
_________________________________
ng a écrit, le 19/10/2004 21:42 :

Salut,
http://groups.google.fr/groups?q=isnumeric+group:*fr.vb*+author:Zoury&hl=fr&lr=&selm=OfNoq1ZCDHA.2396%40TK2MSFTNGP12.phx.gbl&rnum=3




Avatar
Gloops
Si, c'est pas mal, astucieux même.

Dans ma base Access j'ai dû développer une fonction "SansVirgule" pour
transformer la virgule en point pour être sûr que mon artillerie
fonctionne dans tous les pays.

C'est ça que je trouve dommage. Pas moyen d'exploiter une chaîne
contenant un nombre de façon fiable sans développer des fonctions perso.
Tu me diras, ça ou peigner la giraffe, pendant ce temps-là on gagne sa
croûte. M'enfin ça donne à la concurrence le temps de montrer qu'avec un
autre produit on est prêt à déployer au bout d'un an, là où avec Access
on a passé trois ans (pour une usine à gaz il faut dire). Même en étant
ménagé comme il faut ça fait un drôle d'effet.

Et au bout d'un an l'autre produit est capable d'afficher un formulaire
sans dire à l'utilisateur final "Votre programmeur est un âne, là il a
mis un entier alors qu'il fallait une chaîne de caractères", ce dont à
vrai dire l'utilisateur final se contre-fiche comme de ses premières
chaussettes (enfin dans le cas général).

Et encore, la gamme Office a pris la place de ses concurrents de
l'époque parce qu'elle faisait mieux précisément dans ces domaines de
gestion des types de données.

Là, je dois reconnaître que je commence à déborder du sujet.

A propos de RegEx, tiens j'ai l'impression qu'on va ouvrir un fil
là-dessus un de ces quatre : ça me paraît intéressant ce que tu dis là.
_________________________________
ng a écrit, le 20/10/2004 18:17 :
Non en effet cela ne fonctionne pas avec Like, il faudrait utiliser des
classes RegEx plus complexes, sinon elle ne te plait pas cette fonction ? :

Function IsNumber(ByVal Value As String) As Boolean
' Leave the next statement out if you don't
' want to provide for plus/minus signs
Dim sDecimal As String
sDecimal = GetDecimalNotation
If Value Like "[+-]*" Then Value = Mid$(Value, 2)
IsNumber = Not Value Like "*[!0-9" & sDecimal & "]*" And _
Not Value Like "*" & sDecimal & "*" & sDecimal & "*"
And _
Len(Value) > 0 And Value <> sDecimal And _
Value <> vbNullString
End Function

Function GetDecimalNotation() As String
GetDecimalNotation = Mid$(CStr(0.1), 2, 1)
End Function



Avatar
ng
Ok.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Gloops wrote:
Si, c'est pas mal, astucieux même.

Dans ma base Access j'ai dû développer une fonction "SansVirgule" pour
transformer la virgule en point pour être sûr que mon artillerie
fonctionne dans tous les pays.

C'est ça que je trouve dommage. Pas moyen d'exploiter une chaîne
contenant un nombre de façon fiable sans développer des fonctions
perso. Tu me diras, ça ou peigner la giraffe, pendant ce temps-là on
gagne sa croûte. M'enfin ça donne à la concurrence le temps de
montrer qu'avec un autre produit on est prêt à déployer au bout d'un
an, là où avec Access on a passé trois ans (pour une usine à gaz il
faut dire). Même en étant ménagé comme il faut ça fait un drôle
d'effet.
Et au bout d'un an l'autre produit est capable d'afficher un
formulaire sans dire à l'utilisateur final "Votre programmeur est un
âne, là il a mis un entier alors qu'il fallait une chaîne de
caractères", ce dont à vrai dire l'utilisateur final se contre-fiche
comme de ses premières chaussettes (enfin dans le cas général).

Et encore, la gamme Office a pris la place de ses concurrents de
l'époque parce qu'elle faisait mieux précisément dans ces domaines de
gestion des types de données.

Là, je dois reconnaître que je commence à déborder du sujet.

A propos de RegEx, tiens j'ai l'impression qu'on va ouvrir un fil
là-dessus un de ces quatre : ça me paraît intéressant ce que tu dis
là. _________________________________
ng a écrit, le 20/10/2004 18:17 :
Non en effet cela ne fonctionne pas avec Like, il faudrait utiliser
des classes RegEx plus complexes, sinon elle ne te plait pas cette
fonction ? : Function IsNumber(ByVal Value As String) As Boolean
' Leave the next statement out if you don't
' want to provide for plus/minus signs
Dim sDecimal As String
sDecimal = GetDecimalNotation
If Value Like "[+-]*" Then Value = Mid$(Value, 2)
IsNumber = Not Value Like "*[!0-9" & sDecimal & "]*" And _
Not Value Like "*" & sDecimal & "*" & sDecimal
& "*" And _
Len(Value) > 0 And Value <> sDecimal And _
Value <> vbNullString
End Function

Function GetDecimalNotation() As String
GetDecimalNotation = Mid$(CStr(0.1), 2, 1)
End Function




1 2