Convertion String / Décimal

Résolu
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 - 16 août 2010 à 12:43
cs_lermite222 Messages postés 492 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
A voir également:

19 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
17 août 2010 à 23:20
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
3
cracos30 Messages postés 81 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 12 avril 2013
16 août 2010 à 13:07
Salut
As tu regardé dans le panneau de config les parametres regionnaux avancés ?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
16 août 2010 à 13:48
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
16 août 2010 à 18:29
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 ?
0

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

Posez votre question
Profil bloqué
16 août 2010 à 18:57
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
16 août 2010 à 22:07
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 ?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
16 août 2010 à 22:36
Dis moi le windows7 que tu as version française?
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
16 août 2010 à 22:55
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.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
16 août 2010 à 23:33
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
0
Profil bloqué
17 août 2010 à 00:47
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
17 août 2010 à 13:33
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
17 août 2010 à 17:45
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 ?
0
Profil bloqué
17 août 2010 à 21:12
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
0
Profil bloqué
17 août 2010 à 21:23
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
17 août 2010 à 22:48
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 ?
0
Profil bloqué
18 août 2010 à 06:53
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
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
18 août 2010 à 12:21
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.
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
11 sept. 2010 à 17:53
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+
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
11 sept. 2010 à 18:44
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+
0
Rejoignez-nous