Convertion String / Décimal [Résolu]

Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
- - Dernière réponse : cs_lermite222
Messages postés
500
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
- 11 sept. 2010 à 18:44
Bonjour,

J'ai fait ce petit programme sous VB2008 Express pour tester la convertion de string en décimal :

Public Class Form1
    Dim num As Decimal

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            num = TextBox1.Text
            NumericUpDown1.Value = num
            TextBox1.Text = "OK " & num
        Catch ex As Exception
            TextBox1.Text = "ERREUR " & num
        End Try
    End Sub
End Class


Sous XP :
- lorsque j'écrit "2.3" dans le TextBox1, il convertie correctement en num = 2.3
- lorsque j'écrit "2,3", il convertie en num = 23

Sous Seven (64 bits) :
- lorsque j'écrit "2.3", il me sort une erreur
- lorsque j'écrit "2,3", il convertie correctement en num = 2.3

Quelqu'un pourrait-il m'expliquer pourquoi ces différences et si il existe une solution pour gérer les point et les virgule de la même façon.

Merci de votre aide
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
3
Merci
Ccito bonsoir

J'ai l'impression de tourner en rond
C'est en vb2008 et pas en vb6 c'est different
voila
   Dim separator As New System.Globalization.NumberFormatInfo
        Dim sp As String
        sp = separator.NumberDecimalSeparator


sp contient sois un . sois une virgule

Bonne prog

Dire « Merci » 3

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

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

Commenter la réponse de cs_ShayW
Messages postés
81
Date d'inscription
vendredi 17 avril 2009
Statut
Membre
Dernière intervention
12 avril 2013
0
Merci
Salut
As tu regardé dans le panneau de config les parametres regionnaux avancés ?
Commenter la réponse de cracos30
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Salut
J'ai bien testé ton code en effet
comme j'ai le xp et non le windows7
33,44 > 3344
mais toi tu écris sous xp ou windows7 ?
si c'est seulement sous xp tu peux remplacer la
virgule par un .
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim r As Integer
        Try
            r = TextBox1.Text.IndexOf(",")
            If r > 0 Then
                TextBox1.Text = TextBox1.Text.Replace(",", ".")
            End If
            num = TextBox1.Text

            TextBox1.Text = "OK " & num
        Catch ex As Exception
            TextBox1.Text = "ERREUR " & num
        End Try
    End Sub


mais si tu veux que ton app marche sur les deux
windows c'est plus compliqué
de savoir quel est le windows sur lequel marche
l'application si c'est xp remplacer la virgule par . ,si c'est seven remplacer le . par ,

possible qu'il y a beaucoup plus simple

bonne prog
Commenter la réponse de cs_ShayW
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Effectivement je voudrait que mon application fonction sur différent poste avec différent OS.

ShavW, j'avait pensé a ta solution mais ce que je redoute c'est que ce ne soit pas lié au type d'OS utilisé mais à un autre paramètre.

Est-qu'il existerait un paramètre qui permétrait de figer le type de séparateur décimal attendu ("." ou ",") pour cette conversion ?

Avez-vous une autre idée ?
Commenter la réponse de ccito
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
Salut ccito

Le séparateur décimal pour un Windows français est par défaut la virgule quel que soit l'OS
Le point est le séparateur décimal en programmation Visual Basic pour assigner une valeur décimale à une variable

donc on écrit
TextBox.Text = "2,54" <-- c'est une chaine de caractères
Dim valeur as double
Valeur = 2.54 <-- c'est une variable numérique double

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Merci pour votre aide.

Si je comprend bien le séparateur décimal d'un String est définie par le language paramétré (en effet, mon poste XP est en Anglais) et VB reconné ce séparateur pour faire la conversion.

Peut-on connaitre par programme le type de séparateur décimal définie ?

Y-a-t-il d'autre language qui utilise la "," comme séparateur décimal dans une chaine de carractère ?

Mon but est de pouvoir convertir une chaine de carractère en décimal quelque soit le séparateur décimal utilisé. Au vue de ce que vous me dite, il faut donc que je corrige la chaine de carractère en fonction du séparateur utilisé par windows. Qu'en pensez-vous ?
Commenter la réponse de ccito
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Dis moi le windows7 que tu as version française?
Commenter la réponse de cs_ShayW
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Désolé je me suis peut-être mal expliqué.

Windows 7 est paramétré en Français dans les paramètres régionaux alors que mon XP est paramètré en Anglais.
Commenter la réponse de ccito
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Justement j'ai trouvé un code qui permet de détecter le windows de ton pc

il se sert de API function
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Private Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128      '  Maintenance string for PSS usage
End Type
Private Function getverswindows() As String
Dim version As String
Dim os As OSVERSIONINFO ' receives version information
Dim retval As Long ' return value
os.dwOSVersionInfoSize = Len(os) ' set the size of the structure
retval = GetVersionEx(os) ' read Windows's version information
version = os.dwPlatformId & "." & os.dwMajorVersion & "." & os.dwMinorVersion
Select Case version
Case "1.4.0"
GetWindowsVersion = "Win 95"
Case "1.4.10"
GetWindowsVersion = "Win 98"
Case "1.4.98"
GetWindowsVersion = "Win ME"
Case "2.3.51"
GetWindowsVersion = "Win NT 3"
Case "2.4.0"
GetWindowsVersion = "Win NT 4"
Case "2.5.0"
GetWindowsVersion = "Win 2000"
Case "2.5.1"
GetWindowsVersion = "Win XP"
Case "2.6.0"
GetWindowsVersion = "Win Vista"
Case "2.6.1"
GetWindowsVersion = "Win Seven"
Case Else
GetWindowsVersion = "Unknown"

End Select

End Function




comme j'ai seulement le windowsXP en anglais
j'ai fait marché le code avec le debugger
le Select Case version est de valeur 2.5.1
qui correspond bien à windowsxp
Il suffit de verifié la valeur Case version
et ajouter dans la liste des cases s'il n'y est
pas

Bonne prog
Commenter la réponse de cs_ShayW
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
Salut ccito

Pour connaître le séparateur décimal de ton OS : http://www.vbfrance.com/codes/CONNAITRE-SEPARATEUR-DECIMAL-VOTRE-ORDINATEUR_1191.aspx

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Grenier Alain Bonjour

Bien sur le link que tu as donné est la bonne réponse


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

Bien dit
Commenter la réponse de cs_ShayW
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Merci ShayW et Alian pour les liens,

Mais je penser faire un code du genre :

        Const Num = 0.1
        Dim NumStr As String
        Dim SepDec As Char

        NumStr = Num
        SepDec = NumStr.Substring(1, 1)


Ainsi je récupère le caractère utilisé pour le séparateur décimal.

Quand pensez-vous ?
Commenter la réponse de ccito
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
Salut ccito

tu ne serais pas en train de mélanger VB 6.0 et VB NET

        Const Num = 0.1
        Dim NumStr As String
        Dim SepDec As Char

        NumStr = Num
        SepDec = NumStr.Substring(1, 1) <--  Substring est du VB NET alors que ton post est à l'origine en VB 6.0




La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
Salut ccito
Essaie ceci

        Const Num as Single = 0.1
        Dim NumStr As String
        Dim SepDec As String

        NumStr = Ltrim$(Str$(Num))
        SepDec = Mid$(NumStr,2,1)


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Salut Alain,

J'ai écrit ce code sous VB2008. Il semble fonctionner correctement.

Cependant, je me demande si il n'y aurrait pas une solution plus "propre" pour identifier le séparateur décimal et pour le gérer ?
Commenter la réponse de ccito
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
Salut ccito

tu as écrit : "J'ai écrit ce code sous VB2008" et tu postes en VB 6.0
Comment veux-tu que l'on s'y retrouves ?
Prends le code de ShayW au post précédent

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
67
Date d'inscription
mercredi 5 mai 2010
Statut
Membre
Dernière intervention
20 mai 2011
1
0
Merci
Désolé pour ce mal entendu.

Je suis nouveau sur ce site et débutant en programmation. Je n'avait pas encore fait le lien entre VB.NET et VB2008.
Commenter la réponse de ccito
Messages postés
500
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
0
Merci
Bonjour tou(te)s
Pour éviter les erreurs et laisser l'utilisateur taper le "." ou la "," suivant son humeur j'emploi ce système..(en .Net)
Public Class Form1
  Dim Sep As String
  Dim Nombre As Double

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim DT As String
    DT = Replace(TextBox1.Text, ".", Sep)
    DT = Replace(DT, ",", Sep)
    Nombre = CDbl(DT)
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Sep = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
  End Sub
End Class

A+
Commenter la réponse de cs_lermite222
Messages postés
500
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
0
Merci
Bon, beh y a plus cour..
Public Class Form1
  Dim Sep As String
  Dim Nombre As Double

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Nombre = CDbl(TextBox1.Text)
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Sep = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
  End Sub

  Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    If Not (Char.IsNumber(e.KeyChar) Or e.KeyChar.Equals(Sep) Or Char.IsControl(e.KeyChar)) Then e.Handled = True
  End Sub
End Class

Je viens de trouver la modif sur un snippet.
A+
Commenter la réponse de cs_lermite222