Site:  Cours VB.net  
  1.6.3 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.

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 Single.Parse(chaîne)

 

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 ByRef

Par 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)       'Marche

Dim J As Integer = DirectCast(Q, Integer)   ' échoue

DirectCast échoue car le type d'exécution de Q est Double. CType réussit car Double peut être converti en Integer, mais DirectCast échoue car le type d'exécution de Q n'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.

Dim s As Single

s = CType("123,4", Single)

Console.Out.WriteLine(s.ToString)

Affiche: '123,4'

Par contre s = CType("123.4", Single) est refusé.

 

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.