Partage
  • Partager sur Facebook
  • Partager sur Twitter

La conversion de la chaîne"46.6133"en type 'Double

Erreur de typage "Edit" du au locale Fr Us

Sujet résolu
    11 mars 2015 à 22:58:15

    Bonjour j'en profite pour une deuxième questions... 

    Jai un programme qui communique et recoit des donner a parser pour les retourner dans mes label la durée totale du stream et le current time. 

    la fonction complète contient 

     Private Sub WS1_WsMessageReceived(StrMessage As String) Handles WS1.WsMessageReceived
            Control.CheckForIllegalCrossThreadCalls = False
            SetText(StrMessage)
            If InStr(StrMessage, Chr(34) & "type" & Chr(34) & ":" & Chr(34) & "STATUS" & Chr(34)) <> 0 Or InStr(StrMessage, Chr(34) & "type" & Chr(34) & ":" & Chr(34) & "RESPONSE" & Chr(34)) <> 0 Then
                Dim Spl1() As String, Spl2() As String
                Dim pTime As Integer
                Dim pDuration As Integer
    
    
                If InStr(StrMessage, Chr(34) & "state" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "state" & Chr(34) & ":")
                    Dim pState As Integer = Mid(Spl1(1), 1, 1)
                    If pState = 2 Then
                        SetState(1)
                    Else
                        SetState(0)
                    End If
                End If
                '#####################    l' erreur est ici  ######################################
                '  La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide.
                If InStr(StrMessage, Chr(34) & "duration" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "duration" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    If Spl2(0) = "null" Then Spl2(0) = 0
                    pDuration = Fix(Spl2(0))
                End If
    
                If InStr(StrMessage, Chr(34) & "current_time" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "current_time" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    If Spl2(0) = "null" Then Spl2(0) = 0
                    pTime = Fix(Spl2(0))
                    TrackTime(pDuration, pTime)
                End If
                '#####################    l' erreur est ici  ######################################
                If InStr(StrMessage, Chr(34) & "volume" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "volume" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    If Spl2(0) = "null" Then Spl2(0) = 0
                    If Len(Spl2(0)) >= 3 Then
                        Spl2(0) = Mid(Spl2(0), 3, 1)
                    Else
                        If Spl2(0) = "1" Then Spl2(0) = "10"
                    End If
                    Dim pVolume As Integer = Spl2(0)
                    TrackVolume(pVolume)
                End If
    
                If InStr(StrMessage, Chr(34) & "muted" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "muted" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    Dim pMuteState As Boolean = Spl2(0)
                    If pMuteState = False Then
                        Button5.Text = "Mute"
                    Else
                        Button5.Text = "Unmute"
                    End If
                End If
    
            End If
        End Sub

    la partie de cette fonction ou j'ai l'érreur est celle-ci

      '#####################    l' erreur est ici  ######################################
                '  La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide.
                If InStr(StrMessage, Chr(34) & "duration" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "duration" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    If Spl2(0) = "null" Then Spl2(0) = 0
                    pDuration = Fix(Spl2(0))
                End If
    
                If InStr(StrMessage, Chr(34) & "current_time" & Chr(34) & ":") <> 0 Then
                    Spl1 = Split(StrMessage, Chr(34) & "current_time" & Chr(34) & ":")
                    Spl2 = Split(Spl1(1), ",")
                    If Spl2(0) = "null" Then Spl2(0) = 0
                    pTime = Fix(Spl2(0))
                    TrackTime(pDuration, pTime)
                End If
                '#####################    l' erreur est ici  ######################################

    A l'éxecution j'ai comme erreur 

    "La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide."

    	' Le message recu à parser'
    		StrMessage	"["ramp",{"cmd_id":1,"type":"RESPONSE","status":{"event_sequence":4,"state":1,"content_id":"http://XXX.XX.229.35/lol/oceans.mp4","current_time":0,"duration":46.613333,"volume":1,"muted":false,"time_progress":false,"title":"oceans.mp4"}}]"	String
    
    		' L'erreur
    		La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide.
    
    		' Le contenu des variables lors de l'erreur en execution
    		pDuration	0	Integer
    		pTime	0	Integer
    
    +		Spl1	{Length=2}	String()
    		(0)	"["ramp",{"cmd_id":1,"type":"RESPONSE","status":{"event_sequence":4,"state":1,"content_id":"http://XXX.XX.229.35/lol/oceans.mp4","current_time":0,"	String
    		(1)	"46.613333,"volume":1,"muted":false,"time_progress":false,"title":"oceans.mp4"}}]"	String
    
    -		Spl2	{Length=5}	String()
    		(0)	"46.613333"	String
    		(1)	""volume":1"	String
    		(2)	""muted":false"	String
    		(3)	""time_progress":false"	String
    		(4)	""title":"oceans.mp4"}}]"	String
    
    
    



    Sur la partie duration.. J'ai contourner l'erreur en remplacant 

    Spl2 = Split(Spl1(1), ",")

    par

    Spl2 = Split(Spl1(1), ".")


    du coup j'obtient 46 en int au lieu de "46.613333"

    Mais rebelote sur la partie current_time même type d'erreur et la meme en grugeant avec le "." au lieu de "," ca bug aussi car parfois le current time est de 0.14456 et je garde que le 0 du coup.

     J'ai aussi tenter pas mal d'autre chose comme définir ptime et pduration As Double et changer aussi Fix par Cdbl Mais sans succès non plus. 

    Du coup comment si quelqu'un voie ce que je ne voie pas depuis plusieurs jours que je bataille :/ 



    -
    Edité par Inf3rnus 12 mars 2015 à 0:19:08

    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2015 à 23:35:55

      Bonsoir,

      De quoi t'inspirer: http://www.developpez.net/forums/d530200/dotnet/langages/csharp/convert-todouble-ne-gere-points/

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        12 mars 2015 à 0:16:51

        breizhbugs a écrit:

        Bonsoir,

        De quoi t'inspirer: http://www.developpez.net/forums/d530200/dotnet/langages/csharp/convert-todouble-ne-gere-points/


        Et bien merci c'était a savoir ça !!!! 

        Les fonctions de conversion depuis et vers les chaînes de caractères (respectivement Parse et ToString) s'appuient par défaut sur les locales de la machine pour interpréter les données.

        Sur une machine us :

        (4.5).ToString() renvoie "4.5"
        Convert.ToDouble("4.5") renvoie 4.5
        Convert.ToDouble("4,5") renvoie une exception

        Sur une machine fr :

        (4.5).ToString() renvoie "4,5"
        Convert.ToDouble("4.5") renvoie une exception
        Convert.ToDouble("4,5") renvoie 4.5

        Problème résolu en ajoutant 

        If Spl2(0).Contains(".") Then Spl2(0) = Spl2(0).Replace(".", ",")

        la fonction passe donc de 

        '#####################    l' erreur est ici  ######################################
                  '  La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide.
                  If InStr(StrMessage, Chr(34) & "duration" & Chr(34) & ":") <> 0 Then
                      Spl1 = Split(StrMessage, Chr(34) & "duration" & Chr(34) & ":")
                      Spl2 = Split(Spl1(1), ",")
                      If Spl2(0) = "null" Then Spl2(0) = 0
                      pDuration = Fix(Spl2(0))
                  End If
         
                  If InStr(StrMessage, Chr(34) & "current_time" & Chr(34) & ":") <> 0 Then
                      Spl1 = Split(StrMessage, Chr(34) & "current_time" & Chr(34) & ":")
                      Spl2 = Split(Spl1(1), ",")
                      If Spl2(0) = "null" Then Spl2(0) = 0
                      pTime = Fix(Spl2(0))
                      TrackTime(pDuration, pTime)
                  End If
                  '#####################    l' erreur est ici  ######################################

        à 

                    '#####################    l' erreur est ici  ######################################
                    '  La conversion de la chaîne "46.613333" en type 'Double' n'est pas valide.
                    If InStr(StrMessage, Chr(34) & "duration" & Chr(34) & ":") <> 0 Then
                        Spl1 = Split(StrMessage, Chr(34) & "duration" & Chr(34) & ":")
                        Spl2 = Split(Spl1(1), ",")
                        If Spl2(0).Contains(".") Then Spl2(0) = Spl2(0).Replace(".", ",")
                        If Spl2(0) = "null" Then Spl2(0) = 0
                        pDuration = Fix(Spl2(0))
                    End If
        
                    If InStr(StrMessage, Chr(34) & "current_time" & Chr(34) & ":") <> 0 Then
                        Spl1 = Split(StrMessage, Chr(34) & "current_time" & Chr(34) & ":")
                        Spl2 = Split(Spl1(1), ",")
                        If Spl2(0).Contains(".") Then Spl2(0) = Spl2(0).Replace(".", ",")
                        If Spl2(0) = "null" Then Spl2(0) = 0
                        pTime = Fix(Spl2(0))
                        TrackTime(pDuration, pTime)
                    End If
                    '#####################    l' erreur est ici  ######################################




        Mais ca serai plus propre  de faire une fonction detectant les locale et si fr call this or this c'est faisable ca je pense ... 

        Merci bien Mr breizhbugs j'aurai jamais trouver sans ton lien je ne taper pas du tout les bon mots clefs sur mon pote gogole. Merci Merci

        • Partager sur Facebook
        • Partager sur Twitter
          12 mars 2015 à 0:41:47

          Inf3rnus a écrit:

          Mais ca serai plus propre  de faire une fonction detectant les locale et si fr call this or this c'est faisable ca je pense ... 

          Autrement dit, réinventer Double.Parse ...

          • Partager sur Facebook
          • Partager sur Twitter
          Censément, quelqu'un de sensé est censé s'exprimer sensément.
            12 mars 2015 à 1:06:50

            Sehnsucht a écrit:

            Inf3rnus a écrit:

            Mais ca serai plus propre  de faire une fonction detectant les locale et si fr call this or this c'est faisable ca je pense ... 

            Autrement dit, réinventer Double.Parse ...

            J'ai rien réinventer mais pour que ca fonctionne autant en locale fr que us j'ai modifier 

             

            If Spl2(0).Contains(".") Then Spl2(0) = Spl2(0).Replace(".", ",")

            en 

            If CultureInfo.CurrentCulture.TwoLetterISOLanguageName = "fr" Then Spl2(0) = Spl2(0).Replace(".", ",")

            Et ca fonctionne nikel autant en us que fr.

            Je parlais de detecter dans mon programme la langue courante comme ca je contourne le soucis. 



            -
            Edité par Inf3rnus 12 mars 2015 à 1:08:08

            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2015 à 19:02:32

              Normalement, pour les mécanismes de type sérialisation/désérialisation, on se met d'accord sur un format et on configure les threads émetteurs et récepteurs des flux pour qu'ils aient des réglages cohérents.

              https://msdn.microsoft.com/fr-fr/library/system.threading.thread.currentculture%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

              Même si le thread est aussi un thread d'IHM, ce n'est pas un problème d'utiliser cette propriété car l'objet Thread dispose d'une autre propriété pour la langue d'affichage dans l'IHM.

              https://msdn.microsoft.com/fr-fr/library/system.threading.thread.currentuiculture%28v=vs.110%29.aspx

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              La conversion de la chaîne"46.6133"en type 'Double

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown