Modification des options régionales [Résolu]

Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
- 4 avril 2007 à 15:35 - Dernière réponse :
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
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
Afficher la suite 

Votre réponse

21 réponses

Meilleure réponse
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
2 mai 2007 à 16:00
3
Merci
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);
}

Merci donsabras 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de donsabras
Meilleure réponse
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
3 mai 2007 à 20:21
3
Merci
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

Merci donsabras 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de donsabras
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
4 avril 2007 à 16:13
0
Merci
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# 
Commenter la réponse de MorpionMx
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
4 avril 2007 à 16:58
0
Merci
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 ?
Commenter la réponse de binouse1305
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
5 avril 2007 à 08:45
0
Merci
Pas uniquement pour ton application ?

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

Mx
MVP C# 
Commenter la réponse de MorpionMx
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
5 avril 2007 à 09:05
0
Merci
Oui mais par programmation c'est possible ?
Commenter la réponse de binouse1305
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
5 avril 2007 à 10:05
0
Merci
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# 
Commenter la réponse de MorpionMx
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
5 avril 2007 à 10:13
0
Merci
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.
Commenter la réponse de binouse1305
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
8 avril 2007 à 19:29
0
Merci
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
*/
Commenter la réponse de cs_coq
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
8 avril 2007 à 19:34
0
Merci
Heureusement qu'il y a des personnes qui connaissent les APIs par coeur ici

Mx
MVP C# 
Commenter la réponse de MorpionMx
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
8 avril 2007 à 19:52
0
Merci
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
*/
Commenter la réponse de cs_coq
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
2 mai 2007 à 09:38
0
Merci
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 .
Commenter la réponse de donsabras
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
2 mai 2007 à 12:17
0
Merci
Merci bien mais je ne sais pas comment utiliser cette méthode :-s. Dans quel namespace se trouve-t-elle ?
Commenter la réponse de binouse1305
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
2 mai 2007 à 14:34
0
Merci
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,".")
Commenter la réponse de donsabras
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
2 mai 2007 à 14:47
0
Merci
[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à
Commenter la réponse de donsabras
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
3 mai 2007 à 11:42
0
Merci
Cool ça marche super bien merci. Mais comment tu sais tout ça ? Et où est-ce que tu trouves les codes pour les constantes ???
Commenter la réponse de binouse1305
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
4 mai 2007 à 08:59
0
Merci
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
Commenter la réponse de binouse1305
Messages postés
17
Date d'inscription
mercredi 22 septembre 2004
Dernière intervention
30 janvier 2008
4 mai 2007 à 10:06
0
Merci
Merci c'est cool j'ai trouvé ! :-)
Commenter la réponse de binouse1305
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
6 mai 2007 à 02:18
0
Merci
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
*/
Commenter la réponse de cs_coq
Messages postés
6
Date d'inscription
dimanche 6 mars 2005
Dernière intervention
7 mai 2007
7 mai 2007 à 02:13
0
Merci
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
Commenter la réponse de donsabras

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.