none
Conversione numero decimale da stringa a double RRS feed

  • Domanda

  • Ho un problema di conversione di un numero decimale da formato stringa a formato double, viene perso il separatore decimale ( . punto). Allego il codice .

    Grazie x la collaborazione

     

    Dim POint(3) As Double

     

    Dim strNUM As String = "10.50 , 40.3 , 33.0"

    Dim values() As String

    values = strNUM.Split(","c)

    Dim i As Int16 = -1

    For Each value As String In values

    i += 1

    Point(i) = Double.Parse(value)

    Next

    Console.WriteLine("X{0} Y{1} Z{2}", POint(0), POint(1), POint(2))

    martedì 8 novembre 2011 17:50

Risposte

  • Solo per dare il mio piccolo contributo.
    Il separatore decimale in un double rappresentato come stringa dipende dalla culture che si sta utilizzando.
    Il punto come separatore decimale è specifico della culture, ad esempio, "en-US".
    Quando utilizzi il Parse (http://msdn.microsoft.com/it-it/library/t9ebt447.aspx) puoi specificare che culture vuoi utilizzare per la conversione.

    Ad esempio:

    Dim str = "11.7"
    Dim value = Double.Parse(str, New CultureInfo("en"))

    oppure

    Dim str = "11.7"
    Dim value = Double.Parse(str, CultureInfo.InvariantCulture)

    Puoi valutare anche l'utilizzo del TryParse che ti permette di non ottenere un eccezione se la stringa rappresentante il double non è tale.

    • Proposto come risposta Mario Formosa mercoledì 9 novembre 2011 09:34
    • Contrassegnato come risposta Irina Turcu lunedì 14 novembre 2011 17:11
    mercoledì 9 novembre 2011 09:08
    Moderatore

Tutte le risposte

  • In una stringa il separatore dei decimali è la virgola. Potresti prima trasformare tutti i punti col metodo replace e poi fare come hai fatto. In pratica :

    strNUM=strNum.replace(".",",") ' cambia i punti con virgola

    Chiaramente devi utilizzare un altro separatore.... magari ; invece di , per separare i tre valori.

     

    Ciao.


    mario formosa


    martedì 8 novembre 2011 18:02
  • Ciao Falcon4x4

    Prova a dare un'occhiata a questo link

     Array.ConvertAll(Of TInput, TOutput)(Method)
            http://msdn.microsoft.com/en-us/library/exc45z53.aspx

    Spero ti puo servire, ciao. :)


    Be a good forum member. Make this forum a great place to meet and interact with others around the world.
    martedì 8 novembre 2011 22:40
  • Ciao Xiong Wei

    ho privato il codice di cui mi hai postato il link, ma il risukatato e' che mi sostituisce il punto decimale con la virgola ( secondo le specifiche di sistema),

    devo sempre mantenere il punto decimale come separatore dei decimali ( senza considerare l'impostazione del sistema)

    Grazie

    mercoledì 9 novembre 2011 08:31
  • Solo per dare il mio piccolo contributo.
    Il separatore decimale in un double rappresentato come stringa dipende dalla culture che si sta utilizzando.
    Il punto come separatore decimale è specifico della culture, ad esempio, "en-US".
    Quando utilizzi il Parse (http://msdn.microsoft.com/it-it/library/t9ebt447.aspx) puoi specificare che culture vuoi utilizzare per la conversione.

    Ad esempio:

    Dim str = "11.7"
    Dim value = Double.Parse(str, New CultureInfo("en"))

    oppure

    Dim str = "11.7"
    Dim value = Double.Parse(str, CultureInfo.InvariantCulture)

    Puoi valutare anche l'utilizzo del TryParse che ti permette di non ottenere un eccezione se la stringa rappresentante il double non è tale.

    • Proposto come risposta Mario Formosa mercoledì 9 novembre 2011 09:34
    • Contrassegnato come risposta Irina Turcu lunedì 14 novembre 2011 17:11
    mercoledì 9 novembre 2011 09:08
    Moderatore
  • Il contributo di Massimo chiarisce alla grande !

    Ciao.


    mario formosa
    mercoledì 9 novembre 2011 09:33
  • GRAZIE MASSIMO,

    era prorio questo che cercavo. Ho modificato il codice secondo le tue indicazioni e dentro Point mi ritrovo i valori corretti con il punto decimale.

     

    Dim Point(3) As Double

    Dim strNUM As String =

    "10.50 , 40.3 , 33.0"

     

    Dim values() As String
     

    values = strNUM.Split(","c)

     

    Dim i As Int16 = -1

     

    For Each value As String In values

    i += 1

    POint(i) =

    Double.Parse(value, CultureInfo.InvariantCulture)

     

    Next

    ----------------------------------------------------------------

    Risultato :

    Point(0)=10.5    Point(1)=40.3    Point(2)=33.0

    ----------------------------------------------------------------

    

    mercoledì 9 novembre 2011 09:35
  • Potresti variare il tuo codice così sempre che le impostazioni culturali prevedano come separatore decimale la virgola :

    Dim POint(3) AsDouble

    Dim strNUM AsString = "10.50 , 40.3 , 33.0".replace(",",";").replace(".",",")

    Dim values() AsString

    values = strNUM.Split(";"c)

    Dim i As Int16 = -1

    For Each valueAs String In values

    i += 1

    Point(i) = Double.Parse(value)

    Next


    mario formosa
    mercoledì 9 novembre 2011 09:40
  • Se, però, il tuo codice lo fai girare su un server in cui la Culture di default non è quella che prevede la "," come separatore dei decimali, non funziona.
    Personalmente (ma è un mio modo di operare e, in quanto tale, opinabile), se sono sicuro che ciò che mi arriva ha il "." come separatore dei decimali, utilizzo la culture corretta nelle conversioni senza dover sperare che il server o il pc su cui girerà che l'abbia.

    mercoledì 9 novembre 2011 10:17
    Moderatore
  • Sono daccordissimo sulla soluzione da te suggerita, oltre ad essere più bella, risolve in ogni caso.

    Grazie.


    mario formosa
    mercoledì 9 novembre 2011 10:46