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

Slammer

[Dúvida] Formatação de Valores em C#

11 mensagens neste tópico

Bom dia pessoal,

Venho aqui, mais uma vez, expor uma dúvida que me está a irritar há já algumas horas.

Estou a desenvolver uma aplicação para PDA, sendo que tenho até agora testado em Pocket PC 2003 (funciona tudo direitinho).

Hoje de manhã decidi testar em Windows mobile 5.0 e deparei-me com um problema sempre que fazia um update a qualquer registo, de qualquer tabela que contivesse campos numéricos.

Por exemplo: nos clientes tenho 2 campos com o nome de saldo e plafond, ambos são numéricos com duas casas decimais (até aqui tudo bem).

Quando carrego os dados para a aplicação o valor do saldo, por exemplo, vem em formato "20,0000" e então dá-me erro, pois o sql só deixa introduzir "20.0000". No pocket pc funciona tudo direito, pois quando carrego os dados, eles vem como "20.0000", logo deixa gravar.

Andei a ver várias strings formats, mas nenhuma faz aquilo que quero, que era pegar no "20,0000" e formatar para "20.0000".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso tem a ver com a cultura. Provavelmente tens num sitio em Português e no outro em Inglês.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, já tive a ver nas regional settings.

Mas não há hipotese, ou alguma string format que faço aquilo que eu quero?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm mas se isso é um numero, não tem lógica trabalhares com Strings. Se fosse eu convertia para número.

Visto que isso parece estar com a cultura portuguesa, faria algo do género.

String s = "20,0000";

Double num = Double.Parse(s, new CultureInfo("pt-PT"));

Agora isso é um número, faz com ele o que quiseres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas se eu mandar para o SQL o valor 21,00 (por exemplo) ele não me aceita. Só aceita se enviar 21.00

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah?!

Enviar como? Não estás a enviar um número? Ou estás a enviar uma String?

De qualquer das formas, para obter converter de um para o outro poderás fazer algo do género.

String old = "21,00";

Double num = Double.Parse(old, new CultureInfo("pt-PT"));

String novo = num.ToString(CultureInfo.InvariantCulture);

Mas isto não me parece muito correcto. Como é um número devia-se usar como um número e não como String.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas quem disse que eu estava a utilizar string? lol

se eu meter num update ou num insert o valor 21,00 num campo numérico, ele mandasse ao ar e dá erro. Só consigo se meter 21.00, daí perguntar se existia alguma forma de formatar o campo, substituindo a virgula pelo ponto.

Já agora, o erro é o seguinte: "Data Conversion Failed. [OLE DB Status value (if known = 0 ]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra o código que tens onde está a gerar esse erro. Presumo que seja no momento que fazes executar a query na base de dados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código é o seguinte

private void pictureBoxGravarAlteracao_Click(object sender, EventArgs e)

        {

            DialogResult pergunta = MessageBox.Show("Tem a certeza que pretende actualizar os dados deste cliente?", "Software PDA", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

            if (tabelaprecosComboBox.Text == "")

            {

                tabelaprecosComboBox.Text = "Tab.1";

            }

            if (pergunta == DialogResult.Yes)

            {

                if (nomeTextBox.Text == "" || ncontTextBox.Text == "")

                {

                    MessageBox.Show("Por Favor preencha os campos obrigatórios!", "Software PDA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                }

                else

                {

                    try

                    {

                    string sqlQuery =

                        " UPDATE clientes " +

                        " SET nome = '" + nomeTextBox.Text + "'," +

                        " morada = '" + moradaTextBox.Text + "'," +

                        " codpostal = '" + codpostalTextBox.Text + "'," +

                        " localidade = '" + localidadeTextBox.Text + "'," +

                        " telefone = '" + telefoneTextBox.Text + "'," +

                        " ncont = '" + ncontTextBox.Text + "'," +

                        " plafond = '" + plafondTextBox.Text + "'," +

                        " saldo = '" + saldoTextBox.Text + "'," +

                        " descrtpcl = '" + descrtpclComboBox.Text + "'," +

                        " descrpais = '" + descrnacionalidadeComboBox.Text + "'," +

                        " descrzona = '" + descrzonaComboBox.Text + "'," +

                        " descrnacionalidade = '" + descrnacionalidadeComboBox.Text + "'," +

                        " tabelaprecos = '" + tabelaprecosComboBox.Text + "'," +

                        " obs = '" + obsTextBox.Text + "'" +

                        " WHERE codcl = '" + codclTextBox.Text + "'";

                        SqlCeConnection con = new SqlCeConnection(strConn);

                        SqlCeCommand cmd = new SqlCeCommand(sqlQuery, con);

                     

                        //É aqui que dá erro. Se eu tirar os campos saldo e plafond do update, ele faz o update com sucesso!

                        con.Open();

                        cmd.CommandText = sqlQuery;

                        cmd.ExecuteNonQuery();

                        con.Close();

                        MessageBox.Show("Dados Actualizados", "Software PDA", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);

                    }

                    catch

                    {

                     MessageBox.Show("Não foi possível actualizar os dados na Base de dados. Por favor tente mais tarde...", "Software PDA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                    }

                }

            }

            else

            {

                MessageBox.Show("Operação de Actualização cancelada!", "Software PDA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

            }

        }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Onde é que tens o número? Aí só estás a usar Strings....

Se estiveres a ir buscar o número a uma textbox, então terás que fazer como disse na 2º vez. Parece-me que seja a maneira mais prática. Ou seja, convertes a string para double, e depois reconvertes o double para String.

Outra opção, poderá por passar por substituir os caracteres.

String s = "21,000";

String s_tmp = s.Replace(".", String.Empty);  // Necessário caso o '.' esteja a ser usado como separador dos milhares
s = s_tmp.Replace(',', '.');

Não sei qual dos 2 é o mais eficiente. A primeira versão tem a vantagem que já verifica se é um número válido.

PS: De qualquer forma, devias usar querys parametrizáveis.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado pelo esclarecimento. Vou por isso em pratica e vou ver o comportamento.

Abraço

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