Modifier séparateur décimale - question sur un code snippet

cs_DG78 Messages postés 10 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 7 avril 2012 - 21 mars 2009 à 20:29
cs_DG78 Messages postés 10 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 7 avril 2012 - 22 mars 2009 à 16:40
Bonjour,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>






 






Une question concernant un code snippet (version vb 2005) :






http://www.codyx.org/snippet_modifier-separateur-decimale-options-regionales-linguistiques_264.aspx








 






Je ne sais pas où poser ma question alors je la pose ici.






 






Ce code permet, avec une API, de lire ou de modifier le séparateur des décimales. Sur nos machines françaises, le séparateur est une virgule par contre les calculs se font avec le point. D'où cette modification.






 






Ce snippet fonctionne mais il y a un problème dans le cas suivant:





- le séparateur est la virgule





- je lance le code du snippet en tout début de programme (même en première ligne après un sub main) et je mets le point comme séparateur





- je relis le séparateur : c'est bien un point





- puis dans le code j'effectue un calcul :






 







    Dim cTaux As Single = 19.6






    Dim cHT As Single = 0






    Dim cTTC As Single = 200






 







    cHT = cTTC / 1.196






 







    Dim a As String = FormatNumber(cHT)






 






cHT est égal à 167.224075   et  a est égal à  "167,22" (virgule et non un point)






 






Si je relance le même code, alors on obtient :  a = "167.22"  (c'est un point)






 






Moralité :





La modification de la virgule en point n'est pas prise en compte tout de suite.





Apparemment le framework a déjà lu le séparateur avant de passer sur la première ligne d'exécution.






 






Si quelqu'un a une solution (peut être forcer dotnet à relire le séparateur), alors je suis preneur.





Merci par avance.






 






Dominique

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 mars 2009 à 20:42
Salut
Intéressant.
Peut-êtr suffit-il de laisser le temps au système de se rafraichir.
Après la modif du séparateur et avant de commencer l'exploitation, essaye d'ajouter ceci :
   Application.DoEvents

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 mars 2009 à 21:40
mais pour quelle raison souhaites tu changer le séparateur décimal ?

c'est vraiment le genre de comportement intrusif que je deteste voir dans les applis.

c'est a toi de t'adapter aux parametres regionnaux, et non l'inverse.
0
cs_DG78 Messages postés 10 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 7 avril 2012
21 mars 2009 à 22:06
merci pour vos réponses.


@ jack : j'y ai pensé, j'ai essayé avec et sans  Application.DoEvents 
entre le changement et le code avec le FormatNumber et c'est la même chose et comme je le fais tourner en pas à pas, il a vraiment le temps de se rafraichir ;-)

@renfield : c'est vrai que je pourrais utiliser un replace pour remplacer la virgule en point. Mais c'est tellement plus facile de le changer en début
d'exécution pour le rétablir à la fin. Sinon il faut toujours passer par le replace.
C'est sûr que tu vas me dire : et s'il plante ? 
comme je quitte en testant les exceptions, je peux le rétablir. Et s'il n'est pas rétabli, cela n'est pas bien grave car c'est, à mon sens, une ineptie de modifier le point en virgule et de garder les calculs avec le point. Ce n'est pas la première (ni la dernière) que fait Microsoft.


Et si d'aventure, l'utilisateur a besoin pour un autre logiciel de la virgule, il suffit de lui fournir un utilitaire (basé sur ce snippet) qui la rétabliera.


Il y a aussi une solution plus radicale :  Panneau de config / options régionales et modif mais il faut le faire pour chaque poste utilisateur.
Pas facile, c'est pour cela que le snippet me plaisait bien.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 mars 2009 à 00:26
non non et non, pas de Replace... pas terrible non.

il faut te servir des parametres regionnaux... on ne les modifie pas, c'est n'importe quoi... l'utilisateur a ses preferences, respectes les.

et tu risques de fiche le souk dans les autres applis.

que fais ton appli ?
qu'est-ce qui necessite selon toi tout ce changements ?

le chose est simple, pourtant...

affichage => tu utilise FormatNumber (enfin, la version .Net ^^)
sauvegarde en texte => format international
saisie utilisateur => logiquement, il utilise ses regional settings, donc ok
0

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

Posez votre question
cs_DG78 Messages postés 10 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 7 avril 2012
22 mars 2009 à 16:40
Autre ineptie avec le séparateur numérique.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





Supposons que la culture soit fr-FR, donc le séparateur décimal est la virgule.






 







   
Dim t AsString = "1.5"






   
Dim c AsSingle






   

Single
.Parse(t, c)






    c = CSng(t)






    c = Val(t)






 






Le "1.5" peut provenir d'une saisie dans un TextBox car le point sur le clavier numérique donne un point et non une virgule (ce qui est différent en Access).






 






On va planter sur le Single.Parse et sur le CSng (par contre si t="1,5" cela fonctionnera et donnera c=1.5).





Mais on ne plante pas sur le Val(t).






 






Les deux premières conversions (Single.Parse et CSng) utilisent la culture régionale  alors que la dernière (Val) est invariante.






 






A mon sens, il n'est pas possible de travailler ainsi, tout doit être homogène. La seule solution est donc de modifier (le mieux pendant le temps de l'application) le séparateur décimal en le transformant en point.






 






Avec le snippet (cf mon post de départ), on modifie de façon permanente le séparateur décimal mais cette modification n'est pas prise en compte pour l'application. On le voit en plaçant la ligne suivante après l'appel au snippet :






 







   
Dim separe AsString = ""






    separe = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator






 






On obtient toujours la virgule.





On pourrait penser qu'il faut faire :





Application.CurrentCulture.NumberFormat.NumberDecimalSeparator = "."






 






Et non, pas de chance
NumberDecimalSeparator
est readonly.






 






En conséquence, ce snippet ne sert à rien, ce n'est pas la bonne solution.





La bonne solution se trouve sur Codes-Sources :






 







http://www.vbfrance.com/codes/MODIFICATION-SEPARATEUR-DECIMAL-SANS-API-JSUTE-AVEC-FRAMEWORK_26570.aspx








 






Via un clone de la culture, on modifie, le temps de l'application, le séparateur décimal. On n'a pas besoin de le rétablir à la fin car il ne dure que le temps de l'application.






 






@renfield :  les grands principes du style "touches pas à ma liberté et à mes préférences" s'arrêtent quand la liberté du développeur est mise à mal avec les inepties décrites plus haut. Crois tu sérieusement que l'utilisateur a la liberté quand il achète un matériel. Non, on lui fournit un Windows français avec la virgule comme séparateur alors que les calculs se font avec le point. On ne lui demande pas ses préférences.
0
Rejoignez-nous