• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nokPT

[Resolvido] Converter Strings com % ou € em Número

8 mensagens neste tópico

Bom dia,

Criei um DataGridView, com 4 colunas:

Descrição, PVP, Desconto e Total

A ideia é há medida que o utilizador vai preenchendo a linha, esta vai formatando (tal como no excel), para isso uso:

                dgvEncomendas(1, RowActual).Value = FormatNumber(Qnt, 0)

                dgvEncomendas(2, RowActual).Value = FormatCurrency(PVP, 2) ' Formata em €

                dgvEncomendas(3, RowActual).Value = FormatPercent(Desc, 2) ' Formata com %

Até aqui tudo bem, só que depois necessito de calcular o total da linha e o total da tabela... Converto a string de cada célula (com % ou com €) num número para fazer as contas, estou a usar:

PVP = Double.Parse(dgvEncomendas(2, RowActual).Value, Globalization.NumberStyles.Any)

Só recebo uma excepção "Input String is not in a correct format",

Que outra altenativa tenho, ou como devo fazer ou o que estou a fazer mal?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Explica lá algumas coisas ....

1 - A DataGridView está ligada a alguma fonte de dados ?

2 - Em que evento está a tentar formatar as células ?

3 - Queres mostrar o resultado onde ? Em outra célula (total) ?

Mostra mais código, não tenhas medo, só assim consegues uma melhor e mais rápida resposta!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia,

1 - Para já não está ligada a nenhuma fonte de dados, o utilizador insere manualmente os dados, no fim carrega num botão e neste momento abre um modelo do Calc do OpenOffice e copia para os valores da tabela e outros da form. Futuramente pretendo gravar numa base de dados, mas estou a fazer um passo de cada vez.

2 - Estou a formatar as células, e a fazer os cálculos com o evento: CellValueChanged

3 - Quero mostrar 2 resultados em 2 locais diferentes

3a - Resultado do total da linha, na linha que o utilizador está a editar

3b - Resultado do total da encomenda numa Textbox

A ideia do programa que estou a fazer é fazer um software 100% free ou com softwares 100% para fazer controlo de custos de obras, é uma ideia muito ambiciosa, mas tenho esta necessidade.

Não meti aqui mais código porque pensei que o estava a meter era suficiente, aqui vai o que fiz até ao momento:

Public Class frmMain

    Private Sub Start(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Rotina de arranque do programa
        Try
            ' Configura o alinhamento das colunas da tabela de encomendas
            dgvEncomendas.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
            dgvEncomendas.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            dgvEncomendas.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            dgvEncomendas.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            dgvEncomendas.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            dgvEncomendas.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight

        Catch ex As Exception
            MsgBox("Erro #1 -> " + ex.Message)
        End Try
    End Sub

    Private Sub btnCancelarEncomenda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelarEncomenda.Click
        ' Troca a visibilidade dos botões, limpa a tabela e os campos de dados
        Try
            btnCancelarEncomenda.Visible = False
            btnGravarEncomenda.Visible = False
            dgvEncomendas.Visible = False

            txbFornecedor.Clear()
            txbRefFornecedor.Clear()
            txbFaxEmail.Clear()
            txbLocalEntrega.Clear()
            txbPagamento.Clear()
            txbPrazoEntrega.Clear()
            txbTransporte.Clear()

            txbNomeObra.Clear()
            txbNumeroEncomenda.Clear()
            txbEncomendadoPor.Clear()

            dgvEncomendas.Rows.Clear()
        Catch ex As Exception
            MsgBox("Erro #3 -> " + ex.Message)
        End Try
    End Sub

    Private Sub btnGravarEncomenda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGravarEncomenda.Click
        ' Troca a visibilidade dos botões, verifica a encomenda, cria a encomenda, limpa a tabela e os campos de dados
        Try
            ConnectOpenOffice()
            TransfereDadosEncomenda() 'Copia valores e grava encomenda
            DisconnectOpenOffice()


            btnCancelarEncomenda.Visible = False
            btnGravarEncomenda.Visible = False
            dgvEncomendas.Visible = False

            'TODO, não deve limpar, deve carregar valores de default
            txbFornecedor.Clear()
            txbRefFornecedor.Clear()
            txbFaxEmail.Clear()
            txbLocalEntrega.Clear()
            txbPagamento.Clear()
            txbPrazoEntrega.Clear()
            txbTransporte.Clear()

            txbNomeObra.Clear()
            txbNumeroEncomenda.Clear()
            txbEncomendadoPor.Clear()

            dgvEncomendas.Rows.Clear()

        Catch ex As Exception
            MsgBox("Erro #4 -> " + ex.Message)
        End Try

    End Sub

    Private Sub TransfereDadosEncomenda()
        Try
            Dim oDoc As Object, oSheet As Object
            Dim n As Integer

            'oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummyArray)
            oDoc = StarDesktop.loadComponentFromURL(convertToURL("c:\CSC-EA\Encomenda.ots"), "_blank", 0, dummyArray)
            'oSheet = oDoc.getSheets().getByName("Encomenda") ' Selecciona Encomenda
            oSheet = oDoc.Sheets.getByIndex(0)

            ' TODO verificar se os dados estaão correctamente introduzidos, inclusive na tabela
            ' Copia dados relativos à encomenda
            oSheet.getCellByPosition(7, 9).String = txbFornecedor.Text
            oSheet.getCellByPosition(11, 8).String = txbNumeroEncomenda.Text
            'TODO
            'TODO o resto

            For n = 0 To dgvEncomendas.RowCount - 1 ' Copia valores da tabela
                oSheet.getCellByPosition(1, n + 27).String = dgvEncomendas(0, n).Value ' Descrição
                oSheet.getCellByPosition(7, n + 27).Value = dgvEncomendas(1, n).Value ' Quantidade
                oSheet.getCellByPosition(8, n + 27).Value = dgvEncomendas(2, n).Value ' PVP
                oSheet.getCellByPosition(9, n + 27).Value = dgvEncomendas(3, n).Value / 100 ' Desc. 1 em percentagem
                oSheet.getCellByPosition(10, n + 27).Value = dgvEncomendas(4, n).Value / 100 ' Desc. 2 em percentagem
            Next

        Catch ex As Exception
            MsgBox("Erro #5 -> " + ex.Message)
        End Try
    End Sub

    Private Sub dgvEncomendas_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvEncomendas.CellValueChanged
        ' Calcula o total da linha da tabela das encomendas e o total da encomenda
        Try
            If dgvEncomendas.RowCount > 1 Then
                Dim row As Integer
                Dim RowActual As Integer = dgvEncomendas.CurrentRow.Index
                Dim Qnt As Double
                Dim PVP As Double
                Dim Desc1 As Double
                Dim Desc2 As Double
                Dim Total As Double

                ' Extrai os números da tabela e corrige para double
                If Len(dgvEncomendas(1, RowActual).Value) > 0 Then
                    Qnt = Double.Parse(dgvEncomendas(1, RowActual).Value, Globalization.NumberStyles.Any)
                Else
                    Qnt = 0
                End If
                If Len(dgvEncomendas(2, RowActual).Value) > 0 Then
                    PVP = Double.Parse(dgvEncomendas(2, RowActual).Value, Globalization.NumberStyles.Any)
                Else
                    PVP = 0
                End If
                If Len(dgvEncomendas(3, RowActual).Value) > 0 Then
                    Desc1 = Double.Parse(dgvEncomendas(3, RowActual).Value, Globalization.NumberStyles.Any) / 100
                Else
                    Desc1 = 0
                End If
                If Len(dgvEncomendas(4, RowActual).Value) > 0 Then
                    Desc2 = Double.Parse(dgvEncomendas(4, RowActual).Value, Globalization.NumberStyles.Any) / 100
                Else
                    Desc2 = 0
                End If

                ' Formata os números
                dgvEncomendas(1, RowActual).Value = FormatNumber(Qnt, 0)
                dgvEncomendas(2, RowActual).Value = FormatCurrency(PVP, 2)
                dgvEncomendas(3, RowActual).Value = FormatPercent(Desc1, 2)
                dgvEncomendas(4, RowActual).Value = FormatPercent(Desc2, 2)

                ' Calcula o total da linha
                Total = Qnt * PVP * (1 - Desc1) * (1 - Desc2)
                dgvEncomendas(5, RowActual).Value = FormatCurrency(Total, 2)

                'Calcula o total da encomenda
                Total = 0
                For row = 0 To dgvEncomendas.RowCount - 1
                    Total = Total + Convert.ToDouble(dgvEncomendas(5, row).Value)
                Next

                txbTotalEncomenda.Text = FormatCurrency(Total, 2)
            End If
        Catch ex As Exception
            MsgBox("Erro #6 -> " + ex.Message)
        End Try
    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, já percebi!

Substitui os sinais por nada (vazio) e já funciona.

dgvEncomendas(1, RowActual).Value.ToString.Replace("%", "")

ou

dgvEncomendas(1, RowActual).Value.ToString.Replace("€", "")

Não podes estar a converter algo para Double que não é um número mas sim uma string, como por exemplo "4,4 €"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia,

Já resolvi 50% do problema:

A parte do € funcionou em pleno, mas a parte da % continua a não funcionar:

Com:

                If Len(dgvEncomendas(3, RowActual).Value) > 0 Then
                    dgvEncomendas(3, RowActual).Value.ToString.Replace("%", "")
                    Desc1 = Double.Parse(dgvEncomendas(3, RowActual).Value, Globalization.NumberStyles.Any) / 100
                Else
                    Desc1 = 0
                End If

Recebo montes de excepções: "Input String is not in a correct format"

Se tirar a parte do parse:

                If Len(dgvEncomendas(4, RowActual).Value) > 0 Then
                    dgvEncomendas(4, RowActual).Value.ToString.Replace("%", "")
                    Desc2 = dgvEncomendas(4, RowActual).Value / 100
                    'Desc2 = Double.Parse(dgvEncomendas(4, RowActual).Value, Globalization.NumberStyles.Any) / 100
                Else
                    Desc2 = 0
                End If

Recebo uma excepção: "Conversion from string "0,00%" to type 'Double' in not valid."  em que o 0,00% vai mudando com o valor que introduzo na célula, mas na linha a cima estou a eliminar a %, o comportamento não deveria ser o mesmo que no caso do €?

Atentamente

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm, mas não foi isso que eu te disse! Tu tens é de susbstituir no parse, por exemplo:

If Len(dgvEncomendas(1, RowActual).Value) > 0 Then
    Qnt = Double.Parse(dgvEncomendas(1, RowActual).Value.ToString.Replace("€", ""), Globalization.NumberStyles.Any)
Else
    Qnt = 0
End If

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia,

OK, Obrigado resolvido, podem fechar.

Muito obrigado JPaulino

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom dia,

OK, Obrigado resolvido, podem fechar.

Muito obrigado JPaulino

De nada !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora