CultureInfo

De Banane Atomic
Révision datée du 24 octobre 2017 à 09:07 par Nicolas (discussion | contributions) (→‎Obtenir une culture prédéfinie)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

Généralités

Liste des cultures disponibles

Invariant, neutral, specific culture

Culture Description
invariant culture english sans pays/region.
neutral langue mais sans pays/region.
specific langue associée avec un pays/region.
La propriété Parent d'une culture specific donne la culture neutral.

Obtenir une culture prédéfinie

Csharp.svg
// permet d'obtenir une instance mise en cache et en lecture seule de la culture en-US
// sans les modifications de l'utilisateur courant
CultureInfo enUsCulturePure = CultureInfo.GetCultureInfo("en-US");

CultureInfo enUsCulture = CultureInfo.CreateSpecificCulture("en-US");
// appelle le constructeur new CultureInfo("en-US");
// en cas d'échec appelle le constructeur new CultureInfo("en");

CultureInfo.InvariantCulture;
CultureInfo enCulture = new CultureInfo("en"); // culture neutral en
CultureInfo enUsCulture = new CultureInfo("en-US"); // culture specific en US

// permet d'obtenir la culture en-US sans les modifications de l'utilisateur courant
CultureInfo enUsCulturePure = new CultureInfo("en-US", false);

Obtenir la culture courante

Csharp.svg
CultureInfo ci = Thread.CurrentThread.CurrentCulture;

// raccourci, en lecture seule
CultureInfo.CurrentCulture

// raccourci pour les WinForm
Application.CurrentCulture

Obtenir la culture depuis le code 3 caractères

Csharp.svg
var cultureInfo = CultureInfo.GetCultures(CultureTypes.NeutralCultures).
    FirstOrDefault(ci => ci.ThreeLetterISOLanguageName.Equals("ENG", StringComparison.OrdinalIgnoreCase));

Changer le séparateur de décimal pour l'application courante

Csharp.svg
// on récupère la culture courante
var currentCulture =  Thread.CurrentThread.CurrentCulture;

// comme elle est en lecture seule, on la copie
var dotCulture = (CultureInfo)currentCulture.Clone();

// on peut donc modifier la copie
dotCulture.NumberFormat.NumberDecimalSeparator = ".";

// et on écrase la culture courante par notre nouvelle culture
Thread.CurrentThread.CurrentCulture = dotCulture;

Nombres négatifs entre parenthèses

Csharp.svg
var cultureUS = new CultureInfo("en-US", false);
cultureUS.NumberFormat.NumberNegativePattern = 0; // remplace le - par ()

double d = -12.3;
d.ToString("N", cultureUS); // (12.30)
d.ToString(cultureUS); // -12.3
Ne fonctionne qu'avec les formats N, N0, N1, ...
Et force le nombre de chiffres après la virgule.

Autre solution qui permet de n'afficher que les nombres significatifs après la virgule:

Csharp.svg
double d = -12.3;
d.ToString("0.##;(0.##)", new CultureInfo("fr-FR", false))); // (12,3)

Séparateur de groupe

Csharp.svg
double d = 1234.56;
CultureInfo CultureUS = new CultureInfo("en-US", false);
string s1 = d.ToString("N", CultureUS); // 1,234.56
CultureUS.NumberFormat.NumberGroupSeparator = "'"; // remplace le séparateur de groupe (espace en FR, virgule en US) par '
string s2 = d.ToString("N", CultureUS); // 1'234.6

Exemple

Csharp.svg
var cultureFR = new System.Globalization.CultureInfo("fr-FR", false);
CultureInfo cultureCourante = CultureInfo.CurrentCulture;

string séparateurDecimal = cultureFR.NumberFormat.NumberDecimalSeparator; // ,

int nbChiffresApresVirgule = 2;
string zeros = new string('0', nbChiffresApresVirgule); // 00
String.Format("0{0}{1}", séparateurDecimal , zeros); // 0,00
Le constructeur CultureInfo(string culture) appelle le constructeur CultureInfo(culture, true).

Si le second paramètre bool est à true et que la culture spécifiée correspond à celle de l'utilisateur local, alors les modifications de culture de l'utilisateur sont prises en compte.

Sinon c'est la culture spécifiée et non modifiée qui est utilisée.

DateTime et Culture