Modification des options régionales

Résolu
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008 - 4 avril 2007 à 15:35
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 7 mai 2007 à 09:15
Salut !

Je recherche comment modifier le séparateur décimal qui se trouve dans les options régionales, au démarrage de mon application.
J'ai essayé ceci : System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator = ",";

mais la classe CurrentInfo est en lecture seule et il m'indique l'erreur correspondante.
Je voudrais faire la même chose pour le symbole monétaire.

Si quelqu'un a une idée elle est bienvenue

Merci d'avance

Yann

21 réponses

donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
2 mai 2007 à 16:00
Et evidemment pour les PDA kernel32.dll devient coredll.dll
soit:  [DllImport("coredll.dll")]

Je viens de tester et c'est ok donc pour finir :

private const int LOCALE_SYSTEM_DEFAULT = 0x400;
private const int LOCALE_SDECIMAL  = 0x0E;
private const int LOCALE_SCURRENCY = 0x14;

[DllImport("coredll.dll")]
static extern bool SetLocaleInfo(uint Locale, uint LCType, string lpLCData);

void SetDecimalSymbol (string str)
{
    SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL,    str);
     SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SCURRENCY,    str);
}
3
donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
3 mai 2007 à 20:21
Dans la doc crosoft de setlocaleinfo, il y a un fichier include indiqué (je me souviens plus lequel) il suffit de regarder dedans pour voir les defines qui vont bien ;-)
En plus avec goofle tu peux trouver ces inbfos , même si il fautr les adapter un peu.
Bonne continuation
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
4 avril 2007 à 16:13
Salut,

il faut allouer une nouvelle instance de CultureInfo a ton Thread courant.
Par exemple, pour une culture US :

<hr />CultureInfo ci =
new
CultureInfo(
"en-US");

Thread.CurrentThread.CurrentCulture = ci;

Console.WriteLine(
"{0:C}",10 );
<hr />
Te donnera $10 en sortie.

Si maintenant tu veux changer '$' par "USD", et les '.' par des ','

<hr />CultureInfo ci =
new
CultureInfo(
"en-US");
ci.NumberFormat.CurrencySymbol =
"USD ";
ci.NumberFormat.NumberDecimalSeparator =
",";

Thread.CurrentThread.CurrentCulture = ci;
<hr />

Mx
MVP C# 
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
4 avril 2007 à 16:58
Merci mais dans mon application il y'a des tests sur System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
donc dans l'idéal j'aimerai réellement changer les options régionales pas uniquement pour mon application.
Est-ce possible ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
5 avril 2007 à 08:45
Pas uniquement pour ton application ?

Alors ca se trouve dans les options régionale de windows;)

Mx
MVP C# 
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
5 avril 2007 à 09:05
Oui mais par programmation c'est possible ?
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
5 avril 2007 à 10:05
Peut-etre via WMI ?
En tout cas, je serais l'utilisateur, je n'aimerais pas qu'une application me change ces valeurs.

Pourquoi ce n'est pas suffisant au niveau de ton application ?

Mx
MVP C# 
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
5 avril 2007 à 10:13
WMI ?
Pour des raisons x ou y ces paramètres sautent et se reconfigurent avec "$" en symbole monétaire et le séparateur décimal ".". Nous souhaiterions donc via l'application modifier ces paramètres.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 19:29
Salut,

Regarde du côté de SetLocaleInfo.
Par contre ne pas utiliser cette méthode dans une application dans le but de changer les paramètres définis par l'utilisateur, une application qui me fait ce coup là signe son arrêt de mort, et je ne dois pas être le seul :-)
Donc si cette modification des 2 paramètres est le souhait de l'utilisateur, ne pas modifier ce choix et traiter les informations avec une modification n'affectant que le code de l'application.
Si ça se fait réellement tout seul, une application sur la machine utilise peut être SetLocaleInfo pour forcer ce changement.................

/*
coq
MVP Visual C#
CoqBlog
*/
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
8 avril 2007 à 19:34
Heureusement qu'il y a des personnes qui connaissent les APIs par coeur ici

Mx
MVP C# 
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 19:52
Ba celle là je m'en souviens parce que j'ai lu quelquechose qui disait de ne pas l'utiliser il y a quelques temps, pour les raisons citées :-)
Et puis pour une fois que le nom est assez parlant :p

/*
coq
MVP Visual C#
CoqBlog
*/
0
donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
2 mai 2007 à 09:38
Vous supposez ici que l'application est grand public.

Il y a des cas ou il est souhaitable que l'application applique des réglages tels que le remplacement de la virgule par un point pour le séparateur décimal. C'est le cas des application professionnelles industrielles pour le PPC.

thread.CurrentThread.CurrentCulture

ne concerne que le thread en cours et il serait vraiment pénible de respécifier l'ensemble des settings pour chaque thread de chaque application.

Svp n'assomez pas les développeurs avec des dogmes, chacun reste responsable de ce qu'il fait, tout particulièrement dans le domaine des applications métier.

Pour en revenir à la question initiale du topic:
SetLocaleInfo (LANF_DEFAULT, LOCALE_SDECIMAL,".") devrait faire l'affaire .
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
2 mai 2007 à 12:17
Merci bien mais je ne sais pas comment utiliser cette méthode :-s. Dans quel namespace se trouve-t-elle ?
0
donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
2 mai 2007 à 14:34
On "emprunte" la méthode aux api32 windows

        [DllImport("kernel32.dll")]
        static extern bool SetLocaleInfo(uint Locale, uint LCType, string lpLCData);

Et j'en profite pour simplifier avec des constantes numériques:
SetLocaleInfo (0, 0xE,".")
0
donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
2 mai 2007 à 14:47
[edit] de mon poste précédent, 0 n'est pas la valeur par défaut pour locale, c'est 0x400.
Donc:

private const int LOCALE_SYSTEM_DEFAULT=0x400;

private const int LOCALE_SDECIMAL=0xE;

SetLocaleInfo (LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL,".")

Voilà
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
3 mai 2007 à 11:42
Cool ça marche super bien merci. Mais comment tu sais tout ça ? Et où est-ce que tu trouves les codes pour les constantes ???
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
4 mai 2007 à 08:59
J'ai cherché sur la msdn et sur google mais j'ai pas trouvé. A l'occasion si tu peux m'indiquer un lien. Merci
0
binouse1305 Messages postés 17 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 30 janvier 2008
4 mai 2007 à 10:06
Merci c'est cool j'ai trouvé ! :-)
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 mai 2007 à 02:18
La précision de l'environnement Compact Framework aurait été bienvenue :-)
Moi ce que j'en dit... sauf si les appareils sont exclusivement dédiés à cette tâche, attend toi à quelques remontées utilisateur plus ou moins virulentes si le déploiement de ton application les obligent à utiliser un '.' à la place de leur ',' habituelle dans leurs applications dont le comportement n'est pas censé être modifié.
Et non, je ne suppose pas que l'application est grand public, un utilisateur est un utilisateur.
Et le concept de chacun est responsable de ce qu'il fait est un peu erroné : les problèmes seront pour celui qui sera chargé de la maintenance, qui ne sera pas forcément celui qui a développer.
Ensuite le problème ne se pose sans doute pas (encore) en environnement mobile, mais le changement de ce type de paramètre doit probablement être désactivable : utiliser ce genre de chose sur une appli desktop destinée à tourner sur des postes en entreprise où les utilisateurs sont en général assez limités est plutôt risqué.
C'est la même chose que pour ce bon vieux problème du "j'écris tout dans le répertoire d'installation", ce qui donne de splendides résultats en terme d'utilisation concurente de l'application par plusieurs utilisateurs, de problèmes de sécurité et de confidentialité, de sauvegarde... 
Sans parler du risque de mort violente pour celui qui devra aller annoncer ça à celui/ceux qui gèrent le parc du client.

Enfin bref si tu utilises cette solution, documente là bien histoire d'être en mesure de se souvenir rapidement de son existance durant la phase de maintenance.

/*
coq
MVP Visual C#
CoqBlog
*/
0
donsabras Messages postés 6 Date d'inscription dimanche 6 mars 2005 Statut Membre Dernière intervention 7 mai 2007
7 mai 2007 à 02:13
Hum, j'avoue ne pas avoir tout suivi dans ce raisonnement...
Ma remarque ne s'applique qu'aux PPC dans un environnement applicatif métier dédié et destiné à un utilisateur unique.
C'est la raison pour laquelle je continue à affirmer que les dogmes trouvent leurs limites et ici c'est bien le cas.
Nos utilisateurs itinérants ont parfois besoin de réinstaller l'ensemble de leur logiciel (oubli de laisser en charge pendant leurs congés ou longs week end, changement d'heure d'été etc ...)
Les gars de la maintenance nous bénissent de patcher les données de configuration "en dur", cela leur évite à cette occasion quelques miliers d'appels (notre application est déployée sur 300 PPC en europe).
Voilà, j'espère que c'est plus clair et que personne ne va mourir
0
Rejoignez-nous