|
Site |
Cours VB.net |
|
|
|
Conversion, séparateur décimal. |
|
|
4815162342
On a vu qu'on peut afficher les chaînes de caractères (des 'String'); par ailleurs, on fait des calculs avec les variables numériques (Integer, Single..).
On a donc besoin sans arrêt de faire des calculs avec des variables numériques et de transformer le résultat en String pour l'afficher et vice versa.
Est-il possible de convertir une variable d'un type à un autre? OUI!!
On aura donc besoin de savoir transformer des variables de tous types en d'autres types.
1- Conversion numérique<==>Chaîne de caractères.
Conversion numérique=>String= 'ToString'
Quel intérêt de convertir?
On veut afficher un résultat numérique.
On ne peut afficher que des String (chaîne de caractères) dans un label ou un TextBox par exemple.
Aussi, il faut transformer cette valeur numérique en chaîne avant de l’afficher, on le fait avec la méthode ".ToString":
Dim i As Integer=12 'On déclare une variable i qu'on initialise à 12
Label.text = i.ToString
La valeur de i est transformée en String puis affectée à la propriété Text du label, ce qui affiche '12'
On verra plus loin qu'on peut ajouter des paramètres.
Conversion String=>numérique= 'CStr'
A l’inverse une chaîne de caractères peut être transformée en numérique :
Par exemple, l'utilisateur doit saisir un nombre, il saisit un nombre dans une boite de saisie (InputBox), mais il tape des caractères au clavier et c'est cette chaîne de caractères qui est retournée, il faut la transformer en numérique.
Dim s as String
Dim i as Integer
s= InputBox ("Test", "Taper un nombre") 'Saisie dans une InputBox d'un nombre par l'utilisateur.
's contient maintenant une chaîne de caractères, "45" par exemple.
i=CStr(s) ' s est la variable String.
i contient bien maintenant la valeur 45.
CStr permet donc de convertir du numérique en Sring.
Autre manière de convertir des String=>numérique= 'CType'
Même exemple avec Ctype.
Dim s as String
Dim i as Integer
s= InputBox ("Test", "Taper un nombre") 'Saisie dans une InputBox d'un nombre par l'utilisateur.
's contient maintenant une chaîne de caractères, "45" par exemple.
i=CType(s,Integer) ' s est la variable String, Integer est le type à obtenir.
i contient bien maintenant la valeur 45.
CType permet donc de convertir n’importe quel type en n’importe quel type :
Il suffit de donner à cette fonction la variable à modifier et le type à obtenir.
Il existe encore une autre manière de faire:
i=Integer.Parse(s) 'on transforme la chaîne s en Integer
Bizarre cette syntaxe!! en fait c’est le type Integer qui a une méthode (Parse) qui transforme une chaîne en entier.
Single.Parse(chaîne)Il y a aussi:
Transformation d'une chaîne en Long Long.Parse(chaine) ou Int64.Parse(chaine)
Transformation d'une chaîne en Double Double.Parse(chaîne)
Transformation d'une chaîne en Single
2- Résumons toutes les possibilités de conversion.
A- CType pour toutes les conversions
Ctype peut aussi servir à convertir de la même manière un single en double, un Short en Integer....
Il est donc possible de convertir un type de variable en un autre.
Il suffit de donner à cette fonction la variable à modifier et le type à obtenir.
Dim d As Double = 2.65
Dim i As Integer
i=CType(d,Integer) 'conversion en entier
Pour les forts:DirectCast fait de même mais on doit utiliser une variable ByRef.i=DirectCast(s,Integer) 's doit être ByRefPar contre DirectCast nécessite que le type d'exécution d'une variable objet soit identique au type spécifié.
' nécessite Option Strict Off.
Dim Q As Object = 2.37 ' crée un objet contenant un double.
Dim K As Integer =CType(Q, Integer) 'MarcheDim J As Integer =
DirectCast(Q, Integer)' échoueDirectCast échoue car le type d'exécution de
Qest Double. CType réussit car Double peut être converti en Integer, mais DirectCast échoue car le type d'exécution deQn'est pas encore Integer.TryCast de VB 2005 (Framework 2)
TryCast fonctionne comme DirectCast mais retourne Nothing si la conversion est impossible (et ne plante pas!).
Dim J As Integer =
TryCast(Q, Integer)
B- Fonctions spécifiques
CType fait toutes les conversions, mais on peut aussi utiliser des fonctions qui sont spécifiques au type de la variable de retour: Le nom de ces fonctions contient 'C' comme 'Convert' puis le nom du type de la variable de retour.
CBool() Pour convertir en Booléen CByte() Pour convertir en octet CChar() Pour convertir en Char CDate() Pour convertir en Date CDbl() Pour convertir en Double CDec() Pour convertir en Decimal CInt() Pour convertir en Integer CLng() Pour convertir en Long CObj() Pour convertir en Objet CShort() Pour convertir en Short CSng() Pour convertir en Single CStr() Pour convertir en String
Et en VB 2005
CSByte() Pour convertir en SByte CUShort() Pour convertir en UShort CUInt() Pour convertir en UInteger CULng() Pour convertir en ULong
Exemple CDbl retourne un 'Double'.
Dim I As Integer=123
Dim D As Double
D=CDbl(I) 'donnera D=123 D est un Double (réel double précision)
Ces fonctions sont plus rapides car elles sont spécifiques.
Remarque:
Les fonctions CInt et CLng arrondissent les parties décimales égales à 0,5 au nombre pair le plus proche. Par exemple, 0,5 s'arrondit à 0 et 1,5 s'arrondit à 2. Bizarre!!
Ces fonctions utilisent le séparateur décimal de la langue en cours, celui des paramètres locaux(on reverra cela).
C- Val et Str (de MicroSoft.VisualBasic) existe aussi:
Ouf pour les anciens!!
Ces fonctions permettent aussi la conversion String=>Numérique et Numérique=>String
Val donne la valeur numérique d'une expression String.
Dim i As Integer
i=Val("5") ' i=5
Val s'arrête au premier caractère non numérique.
Val("12er") retourne 12
Val reconnaît le point (et pas la virgule)
Dim i As Double
i=Val("5.45") ' donnera i=5,45
i=Val("5,45") ' donnera i=5
Str transforme une valeur numérique en String:
Dim s As String
s=Str(1999) ' s=" 1999"
Noter bien: Str ajoute un espace à gauche ou le signe'-' si le nombre est négatif.
Str ne reconnaît que le point comme séparateur décimal. (Pour utiliser les autres séparateurs locaux, il faut utiliser la fonction CStr() ).
D- La Classe System.Convert:
La Classe System.Convert permet la conversion d'un type de base vers un autre:
.ToString en fait partie
Exemple
Pour convertir un Single en Byte (entier 8 bits non signé)
.ToByte
Pour convertir un Byte en Single:
.ToSingle
singleVal = System.Convert.ToSingle(byteVal)
en Decimal
.ToDecimal
On a des méthodes pour pratiquement convertir tous les types en tous les types. Cherchez!!
On verra plus loin, la fonction Format utilisée pour convertir les valeurs numériques que vous voulez mettre aux formats dates, heures ou monnaie ou dans d'autres formats définis par l'utilisateur.
Pour faire très simple, retenir ++++:
ToString pour les conversions en String des variables numériques(pour afficher).
CStr pour convertir du numérique en String.
Ctype pour convertir tout en tout.
Le fait de convertir d'un type dans un autre s'appelle ' effectuer un cast'
Conversion Explicite et Implicite.
A noter que dans cette page , on a étudié la conversion Explicite: est permet de forcer la conversion vers un type à l'aide de mots clés.
Exemple
Dim d As Double = 2.65
Dim i As Integer
i=CType(d,Integer)
Il existe aussi la conversion implicite effectuée automatiquement sans syntaxe particulière et de manière transparente.
VB peut le permettre ( Si Option Explicit Off dans la configuration )
Exemple
Dim d As Double = 2.65
Dim i As Integer
i=d 'Pour affecter à i le Double d, Vb a transformé le double d en Integer.
On verra que ce mode de travail n'est pas recommandé.
Conversion restrictive.
Attention, la conversion est dite restrictive si le type final ne peut pas convertir toutes les valeurs du départ:
Si je convertis un Single en Integer, la partie décimale peut être tronquée, c'est une conversion restrictive.
L'inverse (conversion Short en Single par exemple) est dite étendue.
3- Séparateur décimal: le point ou la virgule?
Les fonctions Val () et Str () ne reconnaissent que le point (.) comme séparateur décimal.
Dim s As Single
s=Val ("123.4") 'est accepté, c'est 123,4 en français.
On rappelle aussi que le séparateur d'un littéral est le point (un littéral sert à donner inrectement une valeur à une variable):
Dim s As Single
s= 456.67
Les fonctions CDbl, CType, CSng ou Parse ainsi que ToString utilisent le séparateur des paramètres locaux de la machine . Ils reconnaissent la culture.
Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
En France, sur votre ordinateur, le séparateur décimal est la virgule.
s As SingleDim
s =
CType("123,4", Single)Console.Out.WriteLine(s.ToString)
Affiche: '123,4'
Par contre s = CType("123.4", Single) est refusé.
Au Usa le séparateur décimal est le point.
s = CType("123.4", Single) est accepté
Console.Out.WriteLine(s.ToString)
'Affiche '123.4'
On remarque donc que ToString utilise aussi le séparateur spécifique à la culture.
Console.Out.WriteLine(s.ToString)
Affiche: '123,4' en France
Lors de l'utilisation d'autres séparateurs décimaux (applications internationales, par exemple), convertissez la chaîne en nombre à l'aide de la fonction CDbl ou CType CSng ou Parse.
Pour voir quel est le séparateur en cours:
Menu Démarrer->Paramètres->Panneau de configuration>Options régionales et linguistiques.
Obtient le séparateur décimal en fonction des paramètres locaux de la machine par du code.
SeparateurDécimal = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
On peut modifier le CultureInfo:
On peut, si on est en CultureInfo Français, afficher en mode Us
Dim i As Single = 45.78
' Afficher dans la CultureInfo courante: Français
Console.WriteLine(i.ToString) 'Affiche 45,78
' Créer un CultureInfo en anglais U.S.
Dim us As New CultureInfo("en-US")
' Afficher sur la console en CultureInfo Us.
Console.WriteLine(i.ToString("c", us))
'Affiche 45.78
Il s'agit ici d'une surcharge de ToString , "c" signifie NumberFormatInfo
IsNumeric
On utilise la fonction IsNumeric pour déterminer si le contenu d'une variable peut être évalué comme un nombre.
Exemples:
Dim MyVar As Object
Dim R As Boolean
MyVar = "45"
R = IsNumeric(MyVar) ' R= True.
' ...
MyVar = "678.92"
R = IsNumeric(MyVar) ' R= True.
' ...
MyVar = "45 Kg"
R = IsNumeric(MyVar) ' R= False.
'Attention le dernier exemple indique que "45 Kg" n'est pas purement numérique, mais Val("45 Kg") retourne 45 sans déclencher d'erreur car Val transforme les caractères numériques à partir de la gauche, en s'arrêtant dès qu'il y a un caractère non numérique.
Lexique anglais=>Français:
To Cast = Mouler, couler.
Type = Type, genre.
To parse = analyser.
|
|
|
|
|