Virgule ou point? [Résolu]

Signaler
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004
-
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004
-
Bonjour, je vais commencer un simple logiciel de calcul, mais j'ai un problème à résoudre auparavant, donc il me faut de l'aide. Ce que je voudrais savoir est: y a-t-il une façon (quelques lignes) de faire reconnaître automatiquement au logiciel si sur le PC où il va fonctionner le séparateur décimal est la virgule ou le point et donc éviter toute erreur de calcul?

Merci.

16 réponses

Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Gobillot a enfin trouvé la solution! Elle est très simple et elle fonctionne parfaitement, voilà :

Dim Separateur As String
Dim Lettre As String
Dim Chiffre As Single

' en VB on a toujours le point quand c'est du numérique
Chiffre = 1.1
' en String ça dépend du système
Lettre = Chiffre
Separateur = Mid$(Chiffre, 2, 1)
MsgBox Separateur

Merci.

:big)
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Je dois tout à fait m?excuser avec chris81 . Je viens de reprendre le logiciel pour lequel j'avais ce problème du séparateur décimal et j'ai enfin découvert que, si comme il me semble d'avoir compris (confirmez s'il vous plait !!! :question) ), VB fait toujours ses calculs en utilisant le point comme séparateur décimal, la solution la plus simple et efficace est l'évolution de celle de chris81, parce qu'il n'y a aucune raison de considérer les paramètres régionaux du calculateur où le logiciel va fonctionner : TonChiffre = Replace(Tonchiffre,",",".") fait changer la variable string seulement s'il y a une virgule et il fait obtenir un point, au contraire s'il y a déjà le point il ne fait rien, tout ça donne le même résultat soit qu'on a le point soit qu'on a la virgule comme séparateur décimal. C'est vrai ce que j'ai dit ?

:shy)
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
oui pour un numérique le signe décimal est toujours le point.
et Val ne prend en compte que le point (signe décimal) et la virgule (séparateur de millier) quel que soit la configuration.

Dim x As Single
x = 1234,567

provoquera toujours une erreur

Daniel
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
oui va voir ICI

Daniel
Messages postés
589
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
29 avril 2008
2
salut,
ya qd meme bcp plus court

TonChiffre = Replace(Tonchiffre,".",",")

cela veut dire que meme si TonChiffre est 10.5 ou 10,5 tu aura apres le replace 10,5 donc plus d'erreur dans les calculs

http://www.tarnweb.com
http://www.correzeweb.com
http://www.localetv.com
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Merci à tous les deux je vais faire quelques essais? Ce que Gobillot propose est plus ou moins ce que je pensais : La façon d'avoir les informations sur les defaults du système? mais a ce moment là c'est un petit peu compliqué pour moi de bien comprendre ce gros ensemble de lignes cité? je vais l'étudier. Ce que chris81 propose est très simple et donc très intéressant, mais je ne pense pas qu'il s'agit d'une véritable solution, donc je te fais cette objection : tu me dis que TonChiffre = Replace(Tonchiffre,".",",") change par exemple 10.5 en 10,5 et donc j'aurais 10,5 en tous cas? ça va bien si mon PC a la virgule comme default, mais si je dois faire fonctionner le logiciel sur un PC quelconque, dont je ne connais pas le default ? Je vous demande s'il est possible d'unir vos idées, c'est-à-dire quelques lignes qui gagnent le default du système et après appliquer le Replace : Quelles sont ces lignes qui me donne cette information (probablement elles sont déjà dans la page conseillée par Gobillot)? Pourriez vous les commenter un petit peu? je suis débutant.

Merci encore pour la patience.
Messages postés
589
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
29 avril 2008
2
et ben avec le replace que ton ordi est la virgule pas defaut ou le point tu aura 10,2
http://www.tarnweb.com
http://www.correzeweb.com
http://www.localetv.com
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
Option Explicit

Private 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
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Private Const LOCALE_SDECIMAL = &HE  ' Symbole décimal
Private Const LOCALE_STHOUSAND = &HF ' Séparateur des milliers

Dim Separateur As String

Private Sub Form_Load()
    Dim Lettre  As String
    Dim Chiffre As Single
  
    Call GetUserLocaleInfo(Separateur)
' si pas trouvé --> arrêt programme ?
    If Separateur = " " Then
       MsgBox "Erreur", vbExclamation
       End
       End If

'1er cas
    Lettre = "123.456"
    Chiffre = Replace(Lettre, ".", Separateur)
    MsgBox Chiffre
'2eme cas
    Lettre = "123,456"
    Chiffre = Replace(Lettre, ".", Separateur)
    MsgBox Chiffre

End Sub

Private Sub GetUserLocaleInfo(Symbole As String)
    Dim sBuffer           As String
    Dim nBufferLen        As Long
    Dim LCID              As Long
    LCID = GetSystemDefaultLCID
    nBufferLen = 255
    sBuffer = String$(nBufferLen, vbNullChar)
    nBufferLen = GetLocaleInfo(LCID, LOCALE_SDECIMAL, sBuffer, nBufferLen)
    If nBufferLen > 0 Then
       Symbole = Left$(sBuffer, nBufferLen - 1)
       Else
       Symbole = " "
       End If
End Sub
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
13
Salut, pourquoi faire si compliqué ?

Je pense que le prob se pose uniquement pour des saisies ou des conversions de variables texte en numérique. Dans ce cas, une méthode simple :

If IsNumeric("0.1") then
' Le séparateur est un point
TaVariable = replace(TaVariable,",",".")
else
' Le séparateur est une virgule
TaVariable = replace(TaVariable,".",",")
End If

voire même pour une saisie, dans le keypress d'une textbox :

If IsNumeric("0.1") then
' Le séparateur est un pointif keyascii 44 then keyascii 46
else
' Le séparateur est une virguleif keyascii 46 then keyascii 44
End If

Bonne prog

Cordialement, CanisLupus
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Je suis désolé, mais vos idées ne semblent pas fonctionner. En détail :

- Pour chris81 : Le but n'est pas de forcer le donné à être comme nous le voulons, mais comme chaque PC le veut. Tu dis « même si ton chiffre est 10.5 ou 10,5 tu auras après le replace 10,5 donc plus d'erreur dans les calcules», vrai si le logiciel va fonctionner sur un PC qui considère la virgule comme séparateur décimal, faux s'il va fonctionner sur un PC qui utilise le point.
- Pour CanisLupus : Ce que tu propose est fascinant, mais soit que tu considères « 0.1 », soit que tu considères « 0,1 », IsNumeric donne toujours la valeur Vraie (peut-être parce que l'autre probablement est reconnu comme séparateur des milliers).
- Pour Gobillot : Même si ton code est plutôt compliqué pour moi, il semblerait parcourir la route la meilleure : lire les defaults du PC. Mais si je l'utilise, il me dit que mon séparateur décimal est le point, mais au contraire il s'agit de la virgule? Est-ce que quelqu'un en comprend la raison ?

Merci pour votre intérêt.

:)
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
quelques exemples:

Dim a As String
Dim x As Single

If IsNumeric(a) Then
MsgBox "oui"
x = a: MsgBox "x= " & x
Else
MsgBox "non"
End If
MsgBox "val= " & Val(a)

résultats:

- si le signe décimal est la virgule
- et le séparateur des milliers est l'espacea "1 234,567" --> oui val 1234 x=1234,567 a "1 234.567" --> non val 1234,567a "1.234,567" --> non val 1,234a "1,234.567" --> non val 1

- si le signe décimal est la virgule
- et le séparateur des milliers est le pointa "1 234,567" --> non val 1234a "1 234.567" --> non val 1234,567a "1.234,567" --> oui val 1,234 x=1234,567 a "1,234.567" --> oui val 1 x=1,234567

- si le signe décimal est le point
- et le séparateur des milliers est la virgulea "1 234,567" --> non val 1234a "1 234.567" --> non val 1234.567a "1.234,567" --> oui val 1.234 x=1.234567 a "1,234.567" --> oui val 1 x=1234.567

conclusions:
-Val(a) donne toujours la même valeur, ne prends en compte que le point et l'espace, mais c'est pas forcément le bon résultat.
-il peut avoir confusion avec le signe décimal et le séparateur des milliers.
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
13
sbaguz> ravi que tu considères ma méthode fascinante.
C'est pourtant celle que j'utilise et qui ne m'a jamais fait défaut, quelle que soit le choix du séparateur décimal.
Il n'y a pas "soit que tu considères «0.1», soit que tu considères «0,1»".
Perso, je ne "considère" que «0.1». Et le "IsNumeric("0.1")" renvoie faux si le systeme qui exécute le code est configuré en "," et vrai s'il est en "." Et inversement.
D'autre part, je ne suis pas d'accord avec ton précédent post : En string, une virgule sera toujours une virgule, en numérique, ça dépend de la config du système.
Maintenant, si ta solution te convient, no problemo. Teste-là quand même sur différentes configs.

Cordialement, CanisLupus
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
13
Heu, pour les séparateurs de millier, c vrai que je n'en tiens pas compte mais ça peut se faire.

Cordialement, CanisLupus
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
pas tout à fait.
la virgule peut être le séparateur de millier.

Daniel
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Oui, tu as raison, mais à part ça: c'est vrai que VB fait toujours ses calcules avec le point? (Pour le séparateur de millier je vais tout simplement prevenir l'utilisateur de pas en mettre...).

;)
Messages postés
11
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
15 novembre 2004

Voilà ce dont je voulais une confirmation! Encore une fois Gobillot tu es très gentil et encore une fois je te remercie.

:big)