none
Problemas Com Conversão de DataColumn de String para Double RRS feed

  • Pergunta

  • Olá Pessoal,

    Tenho uma coluna que armazena valores decimais, só que no formato string. Exemplo de valor: "30,00". Preciso obter a soma desta coluna, para tanto, criei uma nova coluna do tipo Double e faço a conversão. Segue o código:

       Dim colDuracao As New DataColumn("DURACAO", GetType(Double))

       colDuracao.Expression = "nr_duracao"

    Porém, a conversão está sendo feita como se a cultura fosse "en-US", ou seja, ao invés de converter a string "30,00" para 30.00, está convertendo para 3000. Determinei a cultura como "pt-BR" no webconfig, não consigo entender o porquê da conversão errada.

    Alguém sabe como eu posso solucionar este problema??

    Desde já agradeço

    segunda-feira, 4 de agosto de 2008 21:50

Respostas

  • Então... os dados estão armazenados em um DataTable, não pego os dados direto de um grid. Não entendi a solução que você sugeriu... De qualquer forma, eu consegui solucionar o meu problema com o seguinte codigo:

     

     

    Código Anterior:

      

    If dsApontamentos.Tables.Contains("OS_APONTAMENTOS") Then

    Dim colDuracao As New DataColumn("DURACAO", GetType(Double))

     

    colDuracao.Expression = "nr_duracao"

    dsApontamentos.Tables("OS_APONTAMENTOS").Columns.Add(colDuracao)

    End If

     

    Solução:

     

    If dsApontamentos.Tables.Contains("OS_APONTAMENTOS") Then

     

    Dim colDuracao As New DataColumn("DURACAO", GetType(Double))

    dsApontamentos.Tables("OS_APONTAMENTOS").Columns.Add(colDuracao)

     

    For Each row As DataRow In dsApontamentos.Tables("OS_APONTAMENTOS").Rows

     

    Dim sDuracao As String = row("NR_DURACAO").ToString()

     

    Dim duracao As Double = 0

    Double.TryParse(sDuracao, Globalization.NumberStyles.Any, System.Threading.Thread.CurrentThread.CurrentCulture, duracao)

     

    row("DURACAO") = duracao

    Next

     

    End If

     

    Ao invés de converter a coluna inteira de uma vez, a solução foi converter registro por registro. Foi a melhor forma que encontrei...

     

    POG é fod...

     

    quarta-feira, 6 de agosto de 2008 13:45

Todas as Respostas

  • Cultura não tem nada a ver com isso... bom... quase nada XD... O fato é que mesmo com outra cultura, você ainda pode mudar o caractere de separação de números (ex.: você pode configurar o Windows para português e ainda assim expressar números como 30,000.00)

    Pelo que entendi, você está tentando pegar o texto direto do grid, certo? Nunca faça isso... Não há garantia alguma de que os dados convertidos para texto serão apresentados da mesma forma em todas as configurações. Há formas de se conseguir o valor tipado de uma coluna.

    Todavia, se ainda assim quiser fazer isso, recomendo o seguinte:

    Code Snippet

                Dim X As String
                X.Replace(".", System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)
                X.Replace(",", System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)




    Isto irá trocar todos os . e , da sua string para o separador de decimais atual para a linguagem atual.
    Note que isso é uma POG* violenta, portanto, tente fazer de outra forma (como obter o valor tipado, se possível).

    * Programação Orientada a Gambiarra ®
    quarta-feira, 6 de agosto de 2008 13:18
  • Então... os dados estão armazenados em um DataTable, não pego os dados direto de um grid. Não entendi a solução que você sugeriu... De qualquer forma, eu consegui solucionar o meu problema com o seguinte codigo:

     

     

    Código Anterior:

      

    If dsApontamentos.Tables.Contains("OS_APONTAMENTOS") Then

    Dim colDuracao As New DataColumn("DURACAO", GetType(Double))

     

    colDuracao.Expression = "nr_duracao"

    dsApontamentos.Tables("OS_APONTAMENTOS").Columns.Add(colDuracao)

    End If

     

    Solução:

     

    If dsApontamentos.Tables.Contains("OS_APONTAMENTOS") Then

     

    Dim colDuracao As New DataColumn("DURACAO", GetType(Double))

    dsApontamentos.Tables("OS_APONTAMENTOS").Columns.Add(colDuracao)

     

    For Each row As DataRow In dsApontamentos.Tables("OS_APONTAMENTOS").Rows

     

    Dim sDuracao As String = row("NR_DURACAO").ToString()

     

    Dim duracao As Double = 0

    Double.TryParse(sDuracao, Globalization.NumberStyles.Any, System.Threading.Thread.CurrentThread.CurrentCulture, duracao)

     

    row("DURACAO") = duracao

    Next

     

    End If

     

    Ao invés de converter a coluna inteira de uma vez, a solução foi converter registro por registro. Foi a melhor forma que encontrei...

     

    POG é fod...

     

    quarta-feira, 6 de agosto de 2008 13:45