Gestion des points et des virgules

Résolu
SodeXhinE Messages postés 4 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 27 février 2007 - 25 févr. 2007 à 10:33
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 2 mars 2007 à 22:54
Bonjour,
J'ai un problème pour gérer les nombre decimaux..

J'ai ecris sous VB6 un programme qui me permait de gerer des fiches recettes, ces fiches recettes sont ensuite exportées via un fichier TXT afin d'être recuperées avec excel, ce ficheir TXT est en gros la liste des noms des plats suivi d'un point virgule pour séparer les champs et le prix du plat, ce qui me donne sous excel une colonne nomPlat et une colonne Prix en face.

Sur certain PC le symbol decimal est une virgule, sur d'autre c'est un point et cela me pose des problèmes car sur certains PC excel interprete bien des valeurs numérique alors que sur d'autre ces valeurs sont interpretées en texte

J'ai modifié mon code afin de n'exporter que des points mais si je suis sur un PC qui met des virgules mes prix ne sont pas reconnus et vice versa...

Bref je ne sait pas comment m'en sortir et j'aimerai bien garder ce format TXT

Merci de votre aide

14 réponses

drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
26 févr. 2007 à 09:39
Salut, www.codyx.org recherche > séparateur de décimale

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 févr. 2007 à 10:58
Sous Excel, tu as aussi une petite fonction pour retracer le séparateur décimal
    Dim Separateur As String
    Separateur = Application.International(xlDecimalSeparator)
    MsgBox Sep

À partir de là, tu peux utiliser Replace() au besoin
    Si separateur = "," et Variable contient "."
    Replace point par virgule

MPi
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 févr. 2007 à 21:10
Bonsoir,

Il est tout-à-fait vrai que lorsque l'in passe d'un PC à l'autre, d'un pays à l'autre, (et oui, Sodexho est bien dans ce cas), des difficultés se présentent.

Devant les mêmes difficultés, le choix que j'ai toujours fait en ce qui me concerne, est :
1) de traiter tout en format texte (sommes, dates, etc...) pour l'affichage et l'enregistrement
2) pour les calculs : transposer d'abord systématiquement en format "américain"

Il suffit pour celà de 2 petites fonctions, à faire une fois pour toutes :

a) l'une pour interprêter l'affichage ou la lecture (pour les calculs)
b) l'autre pour décider de l'affichage en fonction du paramètre choisi par l'utilisateur (et pas forcément en fonction des paramètres régionaux car, dans le même pays, il peut y avoir des utilisateurs différents mais sans qu'ils aient vraoment le choix des paramètres régionaux à donner à leur machine)

C'est là une décision importante à prendre dès le début.

Avec un peu d'adresse, on lie le nom de l'utilisateur à un choix de format d'affichage.

Ceci est également vrai pour les bases de données et ne mange presque pas de pain.
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 févr. 2007 à 21:25
Bonsoir, SodeXhinE ,

Je crains que tu n'aies choisi de "reculer pour mieux sauter"..
J'ai fait comme toi, il y a longtemps... et je m'en suis longtemps mordu les doigts (il a bien fallu que je reprenne un jour tout à 0... et plus le temps passe, plus on a du mal à s'y retrouver clairement dans son propre code..., crois-moi... même s'il est parfaitement commenté).
Tant qu'à faire ce travail là (car il te sera inévitable, je le devine bien) : autant le faire maintenant que tu as les idées claires.
Enfin ... Ce ne sont là que les mots d'un vieux crouton ....
3

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

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
25 févr. 2007 à 15:16
Qu'est-ce que tu entends par "garder ce format TXT" ?
Le fichier ou les cellules dans Excel ?

Si tu mettais ton prix dans une variable déclarée
As Double (ou As Currency)
tu ne devrais pas avoir de problème, il me semble... (?)

MPi
0
SodeXhinE Messages postés 4 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 27 février 2007
26 févr. 2007 à 20:42
Merci de vos idées :)
après avoir longement recherhé sur le forum, j'ai opté pour la routine qui oblige le system à mettre des points..
Bon le point du pavet numérique me met des virgules dans les saisies j'ai donc écrit un petit code qui remplace la virgule en point avant de stocker la valeur.. c'est vraiment lourd d'avoir à faire tout se bazard à cause des virgules de cro$oft...

Bref ça à l'air de fonctionner, du moins pour la saisie, mais ca bug un peut plus loin :( je n'ai pas encore identifié la cause du bug.. je ne desespere pas ;)

Merci de votre aide, pour info voici le bout de code que j'ai utilisé pour obliger les virgules dans le system. je précise que le code n'est pas de moi.

'Dans un module il faut déclarer les API suivantes:
 Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
 Public Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
 Public SepDec As String 'Stockage du symbole décimal de la machine avant le lancement du programme
 Public SepDecM As String 'Stockage du symbole décimal monétaire de la machine avant le lancement du programme
 'Ecrivez les fonctions suivantes:
 'Renvoie le séparateur décimal du système
 Public Function SysSepDec() As String
 Dim Sep As String * 2
 GetLocaleInfo 0, &HE, Sep, 2
 SysSepDec = Left$(Sep, 1)
 End Function
 'Renvoie le SEParateur DECimal Monétaire du SYStème
 Public Function SysSepDecM() As String
 Dim Sep As String * 2
 GetLocaleInfo 0, &H16, Sep, 2
 SysSepDecM = Left$(Sep, 1)
 End Function
 'Change le SEParateur DECimal existant par le "Nouveau"
 Public Sub ChangeSepDec(Nouveau As String)
 'séparateur décimal
 SetLocaleInfo 0, &HE, Nouveau
 End Sub
 'Change le SEParateur DECimal Monétaire par le "Nouveau"
 Public Sub ChangeSepDecM(Nouveau As String)
 'séparateur décimal monétaire
 SetLocaleInfo 0, &H16, Nouveau
 End Sub
 '##############
 Public Sub TransformeEnPoint()
 'Dans le Form_load écrivez
 'Récupération du SepDec du système pr nombre et monétaire
 SepDec = SysSepDec
 SepDecM = SysSepDecM
 If (SepDec = ",") Then ChangeSepDec "." 'On passe les "," en "."
 If (SepDecM = ",") Then ChangeSepDecM "."
End Sub
 '##############
 Public Sub Defaut()
 'Dans le Form_Unload donc à la fermeture du programme on remet le séparateur comme il était à l'origine
 ChangeSepDec SepDec 'Remet le séparateur décimal comme il était avant le lancement du programme
 ChangeSepDecM SepDecM 'Remet le séparateur décimal monétaire
End Sub

'###############
 Public Sub TransformeEnVirgule()
 'Dans le Form_load écrivez
 'Récupération du SepDec du système pr nombre et monétaire
 SepDec = SysSepDec
 SepDecM = SysSepDecM
 If (SepDec = ".") Then ChangeSepDec "," 'On passe les "." en ","
 If (SepDecM = ".") Then ChangeSepDecM ","
End Sub
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 févr. 2007 à 22:30
Personnellement, je préfère ne jamais modifier les paramètres d'un ordi. Et j'aimerais bien que personne ne tente de le faire sur le mien...!

Si le programme plante avant la restauration des paramètres, c'est l'utilisateur qui est pris avec le problème...

Je trouve préférable de lire ces paramètres et de s'ajuster selon les cas.

MPi
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
26 févr. 2007 à 22:39
Tu as mille fois raison, MPI ! Celà va de soi...

Cependant, on peut aller plus loin encore en faisant comme je l'ai exposé.
Non seulement on ne touche jamais aux paramètres régionaux, mais, en plus, on permet des affichages différents, sur le même PC, en fonction d'utilisateurs différents de la même machine (ce qui arrive fréquemment dans certains milieux.... et je suppose que c'est l'un des problèmes de Sodexho.... car je devine à quoi correspond le pseudp du demandeur....... - ma boule de crystal à moi...)
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 févr. 2007 à 02:35
Je devine aussi l'origine du pseudo puisque notre café est gérée par Sodexho et je comprends aussi son problème parce que je le vis régulièrement au même bureau. Certains Pc sont Anglais US et d'autres Français Canada, ce qui a pour effet de chambouler les séparateurs décimaux, les séparateurs de fonctions Excel, les dates,... le grand bonheur quoi...

Mais jamais je ne toucherai les paramètres.

L'idée de fonctions lecture/affichage/calculs est une bonne idée.

MPi
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 08:04
Re ceci dis dans le snippet de mortalinon tu ne modifie pas les paramètres régionaux mais uniquement l'application excel! Donc pas de modif des paramètres du PC.

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 févr. 2007 à 11:43
Je n'ai pas vu le code de Mortalino, mais je suis contre le principe de modifier quelque paramètre que ce soit. La configuration de "mon" Windows m'appartient, celle de "mon" Excel m'appartient aussi, ainsi que le reste de "mon" PC.

Tout ça pour dire qu'il n'est pas nécessaire de modifier quoique ce soit si on peut s'adapter en lisant ces configurations...

À partir du moment où on change des paramètres, il existe un risque de ne plus pouvoir les remettre en place. Ce pourrait être un plantage du programme, une panne de courant, ... Peu importe la raison, le risque est là...

MPi
0
SodeXhinE Messages postés 4 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 27 février 2007
27 févr. 2007 à 21:10
Merci de vos réponses :)
Pour l'instant j'ai opter pour la modification des parametres regionaux, c'est pour l'instant l'option la plus simple pour moi, j'ai ecrit un tout petit programme autonome qui s'occupe de ca.
Ceci dit je suis d'accord avec le fait qu'il vaut mieux lire ces parametres et faire en sorte que le code s'adapte à sont environnement.. mais cela demande reflexion et du temps.. pour l'instant mon application fonctionne impecable s'il n'y a pas de virgules dans les nombres decimaux, alors je fais comme ça faute d'avoir du temps pour recoder et analyser toutes les saisies. De plus je me suis rendu compte que sur certains postes, en les parametrant avec des points, ils mettent quand même des virgules quand on utilise le point du pavet numérique c'est vraiment à coucher dehors ce trucs, ça me fait un peut délirer tous ça..
Mais à terme je m'adapterai à la config du poste, mais je trouve ça un peut compliqué et penible :( s'embeter pour des virgules ou des points c'est vraiment barban :-/
0
SodeXhinE Messages postés 4 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 27 février 2007
27 févr. 2007 à 21:54
Je suis d'accord avec toi :) mais le temps me manque cruellement en se moment.. il faut que ca tourne.. et vite. une fois le cap passé je regarderai plus en profondeur, maintenant je sais comment savoir si le system est regle sur des virgules ou des points.. avant je ne savais pas comment le savoir.
J'ai déja réglé le problème des exports des donnés numerique via fichier TXT, je vais une lecture sequentielle des caractere et je remplace systematiquement les virgules par des points quand je suis dans des nombres, tu coup mes exports fonctionnent partout :) alors qu'avant c'etait la cata, les virgules me decallaient les champs du coup les informations contenues dans mes formulaires ne correspondaient à rien du tout :(.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 mars 2007 à 22:54
Quelques règles simples  :

comme le dit MPi, c'est au programme de s'ajuster.
tout affichage devrait se faire en utilisant les preferences de l'utilisateur. En effet, rien de plus grave que d'imposer DD/MM/YYYY là où l'utilisateur attend MM/DD/YYYY.

Tous les exports, sauvegardes, etc doivent être typés, si possibles (je pense aux bases de données : une date s'ecrit dans un champs date !). Si pas de typage possible, export en String, donc, utiliser des formats internationnaux :
un point comme séparateur décimal, et les dates en YYYY-MM-DD.

VB saura les relire, quelques soient les parametres regionaux du poste. En effet, un export (Fichier, Clipboard, Socket...) peut être émis a destination d'un autre poste, qui utilise potentiellement d'autres parametres regionnaux.

la mise en oeuvre ?

Typer toutes les variables, le plus tôt possible.
Lors de la saisie, substituer le point du pavé numérique en le séparateur décimal du poste, dans les TextBox où cela semble logique de le faire. Simplifier la saisie (ca ne fait jamais de mal) et TESTER l'application encore et encore, avec des saisie standard :
.45
,45
12/25/2007
2007.12.25
etc
et des saisies un peu moins conventionnelles dans ces mêmes champs.
le tout, en testant avec différents parametres regionnaux...

c'est long et galère parfois, je sais, je l'ai vécu. Mais je n'aime pas voir de combo me permettant de choisir le séparateur décimal que je souhaite utiliser (dans le meilleur des cas) et encore moins un programme qui m'impose ses paramètres.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous