Site:  Cours VB.net  
4.8 Afficher, CultureInfo.

A- Remarque sur le rafraîchissement de l'affichage.

B- Comment afficher du texte , du numérique suivant le format désiré ?

C- Comment utiliser les 'CultureInfo'

 

A - Remarque sur la mise à jour de l'affichage:

La mise à jour de l'affichage d'un Label (comme les autres contrôles d'ailleurs) est effectuée en fin de Sub:

Si on écrit:

 

Dim i As Integer

For i = 0 To 100

    Label1.Text = i.ToString

Next i

 

La variable i prend les valeurs 1 à 100, mais à l'affichage rien ne se passe pendant la boucle, VB affiche uniquement 100 à la fin; si on désire voir les chiffres défiler avec affichage de 0 puis 1 puis 2... il faut rafraîchir l'affichage à chaque boucle avec la méthode Refresh():

 

Dim i As Integer

For i = 0 To 100

    Label1.Text = i.ToString: Label1.Refresh()

Next i

 

Une alternative est de mettre un Application.DoEvents() qui donne à Windows le temps de traiter les messages et de rafraîchir l'affichage.

 

B - Afficher du text:

On a vu que pour afficher du texte il fallait l'affecter à la propriété 'Text' d'un label ou d'un textBox (ou pour des tests l'afficher sur la fenêtre 'console').

Pas de problème pour afficher des chaînes de caractères, par contre, pour les valeurs numériques, il faut d'abord les transformer en 'String' et les formater (définir les séparateurs, le nombre de décimales...) .

ToString

On a déjà vu que pour afficher une variable numérique, il fallait la transformer en 'string' de la manière suivant:

MyDouble.ToString

Mais ToString peut être surchargé par un paramètre appelé chaîne de format. Cette chaîne de format peut être standard ou personnalisée.

Cette chaîne est de la forme 'Axx' ou A donne le type de format et xx le nombre de chiffre après la virgule. Le format est défini par la 'culture' en cours sur le thread courant.

Imports System
Imports System.Globalization
Imports System.Threading

Module Module1
Sub Main()

Thread.CurrentThread.CurrentCulture = New CultureInfo("en-us")
'changement de culture
Dim UnDouble As Double = 123456789

Console.WriteLine("Cet exemple est  en-US culture:")

Console.WriteLine(UnDouble.ToString("C"))    '
format monétaire (C) affiche $123,456,789.00
Console.WriteLine(UnDouble.ToString("E"))    '
format scientifique (E) affiche     1.234568E+008
Console.WriteLine(UnDouble.ToString("P"))    '
format %   (P)            affiche      12,345,678,900.00%
Console.WriteLine(UnDouble.ToString("N"))    '
format nombre (N)    affiche      123,456,789.00
Console.WriteLine(UnDouble.ToString("F"))    '
format virgule fixe (F) affiche       123456789.00


End Sub
End Module

 

Autre exemple:

S=(1.2).ToString("C") retourne en CurrentCulture Français (par défaut sur mon ordinateur):1,2€

Il existe aussi D pour décimal, G pour général X pour hexadécimal.
 

On peut créer de toute pièce un format, on utilise pour cela les caractères suivants:

0 indique une espace réservé de 0

Chaque '0' est réservé à un chiffre. Affiche un chiffre ou un zéro. Si le nombre contient moins de chiffres que de zéros, affiche des zéros non significatifs. Si le nombre contient davantage de chiffres à droite du séparateur décimal qu'il n'y a de zéros à droite du séparateur décimal dans l'expression de format, arrondit le nombre à autant de positions décimales qu'il y a de zéros. Si le nombre contient davantage de chiffres à gauche du séparateur décimal qu'il n'y a de zéros à gauche du séparateur décimal dans l'expression de format, affiche les chiffres supplémentaires sans modification.

indique un espace réservé de chiffre.

Chaque '#' est réservé à un chiffre. Affiche un chiffre ou rien. Affiche un chiffre si l'expression a un chiffre dans la position où le caractère # apparaît dans la chaîne de format ; sinon, n'affiche rien dans cette position.

Ce symbole fonctionne comme l'espace réservé au 0, sauf que les zéros non significatifs et à droite ne s'affichent pas si le nombre contient moins de chiffres qu'il n'y a de caractères # de part et d'autre du séparateur décimal dans l'expression de format.

. (point) indique l'emplacement du séparateur décimal (celui affiché sera celui du pays )

Vous devriez donc utiliser le point comme espace réservé à la décimale, même si vos paramètres régionaux utilisent la virgule à cette fin. La chaîne mise en forme apparaîtra dans le format correct pour les paramètres régionaux.

, (virgule) indique l'emplacement du séparateur de millier.

Séparateur de milliers. Il sépare les milliers des centaines dans un nombre de quatre chiffres ou plus à gauche du séparateur décimal.

"Littéral" la chaîne sera affichée telle quelle.

% affichera en  pour cent.

Multiplie l'expression par 100. Le caractère du pourcentage (%) est inséré

E0 affiche en notation scientifique.

: et / sont séparateur d'heure et de date.

; est le séparateur de section : on peut donner 3 formats (un pour les positifs, un pour les négatifs, un pour zéro) séparés par ;

Exemple:

Chaîne de format '0000', le chiffre 145 cela affiche  '0145'

Chaîne de format '####', le chiffre 145 cela affiche  '145'

Chaîne de format '000.00', le chiffre 45.2 cela affiche  '045.20'

Chaîne de format '#,#', le chiffre 12345678 cela affiche  '12,345,678'

Chaîne de format '#,,' le chiffre 12345678 cela affiche  '12'

La chaîne de formatage' #,##0.00 ' veut dire obligatoirement 2 chiffres après le séparateur décimal et un avant:

Si on affiche avec ce format

 1.1 cela donne     1,10

 .5  cela donne     0,50

4563 cela donne  4 563,00
 

Exemple:

Dim N As Double = 19.95

Dim MyString As String = N.ToString("$#,##0.00;($#,##0.00);Zero")


' En page  U.S. English culture, MyString ="$19.95".
' En page  Française , MyString ="19,95€".

 

Exemple 2:

Dim UnEntier As Integer = 42
MyString = UnEntier.ToString( "Mon nombre " + ControlChars.Lf + "= #" )

Affiche:
Mon nombre
 = 42

 

Str() de Microsoft.VisualBasic est toujours accepté 
Il permet de transformer une variable numérique et String, qui peut ensuite être affichée.
MyString=Str( LeNombre)
Label1.Text=MyString
Pas de formatage..
 
String.Format du Framework
Permet de combiner des informations littérales à afficher sans modification et des zones formatées.
Les arguments de String.Format se décomposent en 2 parties séparées d'une virgule.
Exemple:
Si A=3 et B=5
MsgBox(String.Format("{0} + {1} = {2}",A, B, A+B)) affiche  3+5=8
Autre exemple:
Dim MonNom As String = "Phil"
String.Format("Nom = {0}, heure = {hh}", MonNom, DateTime.Now)

Le texte fixe est "Nom =" et  ", heure =  ", les éléments de format sont « {0} » et « {hh} » et la liste de valeurs est MonNom et DateTime.Now.

Cela affiche: Nom = Phil   Heure= 10

 

Là aussi on peut utiliser les formats:

   MsgBox(String.Format("{0:C}",-456.45))    Affiche -456,45€

   MsgBox(String.Format("{0:D8}", 456))    Affiche 00000456    Décimal 8 chiffres

   MsgBox(String.Format("{0:P}", 0.14))    Affiche   14%    Pourcent

   MsgBox(String.Format("{0:X}", 65535))    Affiche  FFFF    Hexadécimal

MsgBox(String.Format("{0:##,##0.00}", 6553.23))

 

La fonction Format de Microsoft.VisualBasic (pas la classe String.Format) fournit des fonctions similaires mais les arguments sont dans l'ordre inverse (valeur, chaîne de formatage) et il n'y a pas de numéro d'ordre et de{}!! C'est pratique pour afficher une seule valeur.

MyStr = Format(5459.4, "##,##0.00") ' Returns "5,459.40".
MyStr = Format(334.9, "###0.00") '
Returns "334.90".
MyStr = Format(5, "0.00%") '
Returns "500.00%".
 

 

C - CultureInfo

On se rend compte que l'affichage est dépendant de la CurrentCulture du Thread en cours.

Exemple:

Si la CurrentCulture est la 'CultureInfo  Us' et que j'affiche avec le format 'C' (monétaire)  cela affiche un $ avant, si je suis en 'CurrentCulture  Français' cela affiche un € après.

Par défaut la CultureInfo est celle définie dans Windows, probablement 'fr-FR' sur votre ordinateur .

On peut modifier la CurrentCulture par code (voir exemple plus haut).

Imports System.Threading

Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("en-us")'passage en culture US culture

En VB , on peut utiliser l'objet My.

MsgBox(My.Application.Culture.ToString) 'affiche 'fr-FR'

(My.Application.ChangeCulture 'permettra de changer la culture )

 

En français par défaut:

Le séparateur de décimal numérique est le '.'

Exemple :   1.20

Le séparateur décimal monétaire est la ','

Exemple :   1,20€