Virgule ou point?

Résolu
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004 - 5 nov. 2004 à 14:51
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004 - 15 déc. 2004 à 12:23
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.
A voir également:

16 réponses

sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
9 nov. 2004 à 12:13
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
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
14 déc. 2004 à 17:34
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
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
14 déc. 2004 à 18:29
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
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 nov. 2004 à 15:07
oui va voir ICI

Daniel
0

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

Posez votre question
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
5 nov. 2004 à 15:49
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
0
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
5 nov. 2004 à 17:31
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.
0
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
5 nov. 2004 à 19:19
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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 nov. 2004 à 19:45
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
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
5 nov. 2004 à 20:38
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
0
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
9 nov. 2004 à 11:31
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.

:)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
9 nov. 2004 à 15:31
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.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
9 nov. 2004 à 21:12
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
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
9 nov. 2004 à 21:16
Heu, pour les séparateurs de millier, c vrai que je n'en tiens pas compte mais ça peut se faire.

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

Daniel
0
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
14 déc. 2004 à 18:18
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...).

;)
0
sbaguz Messages postés 11 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 15 novembre 2004
15 déc. 2004 à 12:23
Voilà ce dont je voulais une confirmation! Encore une fois Gobillot tu es très gentil et encore une fois je te remercie.

:big)
0
Rejoignez-nous