Convert está comendo o ponto(.)

19/07/2012

0

Preciso converter string em double. Já tentei de duas formas, como a seguir. Isso eu preciso passar para um Insert em uma tabela de BD e por isso, o decimal point é o ponto e não a vírgula.

Digito isso no meu TextBox: 372,89

Convert.ToDouble(textbox.Text.Replace(,,.); >> Resultado: 372,89 e não 372.89

Continua com a vírgula. Então digito de outra forma(não queria fazer assim, pois o usuário está acostumado a digitar vírgula)

372.89

Convert.ToDouble(textbox.Text); >> Resultado: 37289 e não 372.89

Como fazer uma conversão de uma string, com vírgula para um double com ponto.

No BD o campo é do tipo Decimal(9,2) e uso SqlServer 2008 Express Edition.
Pjava

Pjava

Responder

Posts

19/07/2012

Valter Furtado

acabei de testar aqui...

String str = 372,89;
double? dConvert = null;
double dParam = 0;
if (double.TryParse(str, out dParam))
dConvert = dParam;
Responder

19/07/2012

Pjava

Não deu certo não. No meu aqui deu esse valor:

372.88999999999999 e não 372.89 >> Isso numa contabilidade é mortal e demissão.

Fiz assim e continua com uma dízima muito grande, e todos sabemos que é devido ao tipo string:
double val = Convert.ToDouble(txt_juros.Text.Replace(,,.), CultureInfo.InvariantCulture);

Existe algum controle no Framework 4.0 que ao digitar um valor ele já é double? Tipo, EditCurrency, usado no Jedi do Delphi?
Responder

19/07/2012

Pjava

Eis meus testes:
System.Globalization.CultureInfo cult = new System.Globalization.CultureInfo(pt-BR);
string valor =7,31;
double valorConvertido = double.Parse(valor);

Resultado: 7.31

O valor vem correto, mas se faço conforme abaixo, aí o valor vem em uma dízima terrível

System.Globalization.CultureInfo cult = new System.Globalization.CultureInfo(pt-BR);
string valor = txt_juros.Text;
double valorConvertido = double.Parse(valor);

Resultado:7,30999999999996
Responder

19/07/2012

Joel Rodrigues

PJava, na primeira conversão você obteve 372,89 (que é o valor decimal correto, certo?). Se você inserí-lo no banco como double, ele assumirá este valor, independente do formato. Porém, você deve inseri-lo como DOUBLE e não STRING.
Responder

19/07/2012

Joel Rodrigues

Porém, caso você deseje ler um valor no formato brasileiro e converter para string no formato americano, veja a seguinte sintaxe:
double val = Convert.ToDouble(´´372,89´´);
            NumberFormatInfo nnfi = new CultureInfo(en-US).NumberFormat;
            MessageBox.Show(val.ToString(nnfi));

O valor exibido deve ser ´´372.89´´.

Mas veja a resposta acima, analise bastante, pois pelo que entendi você está querendo inserir o valor decimal no banco como string, o que não é uma boa ideia.

Boa sorte.
Responder

19/07/2012

Pjava

Interessante, que da forma que eu fiz abaixo, o último valor(dtotal) está correto, sem dízima.
System.Globalization.CultureInfo cult = new System.Globalization.CultureInfo(pt-BR);
string vprincipal = txt_principal.Text;
string vmulta = txt_multa.Text;
string vjuros = txt_juros.Text;
string vtotal = txt_total.Text;

double dprincipal = double.Parse(vprincipal);
double dmulta = double.Parse(vmulta);
double djuros = double.Parse(vjuros);
double dtotal = double.Parse(vtotal);

Joel, uma coisa. Se eu passo o valor direto, como nos exemplos vem certo, mas quando eu passo o valor vindo do meu TextBox é aí que a dízima está aparecendo, mas eu não testei esse seu exemplo, vou fazê-lo e já posto, mas com TextBox e não com literal.
Responder

19/07/2012

Pjava

Joel, desse jeito não funcionou:

NumberFormatInfo nnfi = new CultureInfo(en-US).NumberFormat;
double val = Convert.ToDouble(txt_juros.Text,nnfi);
Responder

19/07/2012

Pjava

Ainda há outro problema. Não sabia que double fosse tão cruel assim, parece DateTime. Esses valores vão compor os parâmetros de um método que para inserir no BD. Bem, os parâmteros vindo do método vê assim:
31.99999996 e etc... Bem, até então eu estou testando o Insert então, por ora a quantidade de casas decimais ainda não é importante. Eu uso o StringBuilder para montar o insert. Acontece que o é passado para o banco não é:
31.9999996 e sim, 31,999996 e a vírgula é entendida pelo Sql Server como separador de campos e não de decimais. Então pergunto: Como eu faço para passar o ponto em lugar da vírgula?
Responder

19/07/2012

Joel Rodrigues

PJava, repare que o que você disse que não funcionou não foi o que eu sugeri. Como você falou no primeiro post, a conversão retorna o valor correto, você só precisa ter o ponto no lugar da vírgula ao convertê-lo para string, foi isso que eu mostrei.

Novamente reforço: inserir datas e valores decimais no banco usando concatenação de strings não é uma boa ideia. Para isso existem os parâmetros do SqlCommand, por exemplo.
Responder

19/07/2012

Pjava

Ok, seguindo orientação do Joel, fiz dessa forma e está dando erro assim: Erro de sintaxe próximo a :, mas não consigo pegar a query completa para rodar no Sql Server Manager e ver onde está o erro. Abaixo o código completo do método até agora, claro que ele receberá um bloco try...except e etc...
public bool InsereDarf(string vTrim,DateTime vPag_Ate,DateTime vPer_Apura,string vCnpj,string vCod_Receita,int vNum_Ref,
DateTime vDt_Vencto,double vVal_Principal, double vVal_Multa,double vVal_Juros, double vTotal)
{
SqlConnection conexao = new SqlConnection();
conexao.ConnectionString = ConfigurationManager.ConnectionStrings[conectDarf].ConnectionString;

conexao.Open();

string sql = insert into tbl_darf(trim,pag_ate,per_apura,cnpj,codreceita,num_ref,dt_vencto,val_principal,val_multas,val_juros,val_total) ;
sql += values(:p_trim, :p_pagate, :p_perapura, :p_cnpj, :p_codreceita, :p_numref, :dt_vencto, :p_princip, :p_multa, :p_juros, :p_total);

SqlCommand cmdInsert = new SqlCommand();
cmdInsert.CommandText = sql;
cmdInsert.Connection = conexao;

SqlParameter ptrim = new SqlParameter();
ptrim.DbType = DbType.String;
ptrim.Value = vTrim;
ptrim.ParameterName = p_trim;

SqlParameter ppagate = new SqlParameter();
ppagate.DbType = DbType.String;
ppagate.Value = vPag_Ate;
ppagate.ParameterName = p_pagate;

SqlParameter pperapura = new SqlParameter();
pperapura.DbType = DbType.String;
pperapura.Value = vPer_Apura;
pperapura.ParameterName = p_perapura;

SqlParameter pcnpj = new SqlParameter();
pcnpj.DbType = DbType.String;
pcnpj.Value = vCnpj;
pcnpj.ParameterName = p_cnpj;

SqlParameter pcodreceita = new SqlParameter();
pcodreceita.DbType = DbType.String;
pcodreceita.Value = vCod_Receita;
pcodreceita.ParameterName = p_codreceita;

SqlParameter pnumref = new SqlParameter();
pnumref.DbType = DbType.Int32;
pnumref.Value = vNum_Ref;
pnumref.ParameterName = p_numref;

SqlParameter pdtvencto = new SqlParameter();
pdtvencto.DbType = DbType.DateTime;
pdtvencto.Value = vDt_Vencto;
pdtvencto.ParameterName = dt_vencto;

SqlParameter pprincip = new SqlParameter();
pprincip.DbType = DbType.Double;
pprincip.Value = vVal_Principal;
pprincip.ParameterName = p_princip;

SqlParameter pmulta = new SqlParameter();
pmulta.DbType = DbType.Double;
pmulta.Value = vVal_Multa;
pmulta.ParameterName = p_multa;

SqlParameter pjuros = new SqlParameter();
pjuros.DbType = DbType.Double;
pjuros.Value = vVal_Juros;
pjuros.ParameterName = p_juros;

SqlParameter ptotal = new SqlParameter();
ptotal.DbType = DbType.Double;
ptotal.Value = vTotal;
ptotal.ParameterName = p_total;

cmdInsert.Parameters.Add(ptrim);
cmdInsert.Parameters.Add(ppagate);
cmdInsert.Parameters.Add(pperapura);
cmdInsert.Parameters.Add(pcnpj);
cmdInsert.Parameters.Add(pcodreceita);
cmdInsert.Parameters.Add(pnumref);
cmdInsert.Parameters.Add(pdtvencto);
cmdInsert.Parameters.Add(pprincip);
cmdInsert.Parameters.Add(pmulta);
cmdInsert.Parameters.Add(pjuros);
cmdInsert.Parameters.Add(ptotal);

cmdInsert.ExecuteNonQuery();

cmdInsert.Dispose();
conexao.Close();

return true;
}
Responder

19/07/2012

Joel Rodrigues

Você está usando dois-pontos para identificar os parâmetros, no Visual Studio você deve usar @, dois-pontos é no Delphi.
Exemplo: INSERT INTO TABELA (CAMPO) VALUES (@VALOR).

Testa aí.
Responder

19/07/2012

Joel Rodrigues

Ah, PJava, deixa eu te ensinar uma sintaxe que pode reduzir seu código:
cmdInsert.Parameters.AddWithValue(´NOME_PARAMETRO´, valor_parametro);

Com isso, o tipo do parâmetro é assumido como o tipo do valor.

Um abraço.
Responder

20/07/2012

Pjava

Valeu, Joel salvou meu dia. Eis como ficou: Jóia. Funcionou.

public bool InsereDarf(string vTrim,DateTime vPag_Ate,DateTime vPer_Apura,string vCnpj,string vCod_Receita,int vNum_Ref,
DateTime vDt_Vencto,double vVal_Principal, double vVal_Multa,double vVal_Juros, double vTotal)
{
SqlConnection conexao = new SqlConnection();
conexao.ConnectionString = ConfigurationManager.ConnectionStrings[conectDarf].ConnectionString;

conexao.Open();

string sql = insert into tbl_darf(trim,pag_ate,per_apura,cnpj,cod_receita,num_ref,dt_vencto,val_principal,val_multa,val_juros_encargos,val_total) ;
sql += values(@p_trim, @p_pagate, @p_perapura, @p_cnpj, @p_codreceita, @p_numref, @dt_vencto, @p_princip, @p_multa, @p_juros, @p_total);

SqlCommand cmdInsert = new SqlCommand();
cmdInsert.CommandText = sql;
cmdInsert.Connection = conexao;

cmdInsert.Parameters.AddWithValue(p_trim, vTrim);
cmdInsert.Parameters.AddWithValue(p_pagate, vPag_Ate);
cmdInsert.Parameters.AddWithValue(p_perapura,vPer_Apura);
cmdInsert.Parameters.AddWithValue(p_cnpj, vCnpj);
cmdInsert.Parameters.AddWithValue(p_codreceita, vCod_Receita);
cmdInsert.Parameters.AddWithValue(p_numref, vNum_Ref);
cmdInsert.Parameters.AddWithValue(dt_vencto, vDt_Vencto);
cmdInsert.Parameters.AddWithValue(p_princip, vVal_Principal);
cmdInsert.Parameters.AddWithValue(p_multa, vVal_Multa);
cmdInsert.Parameters.AddWithValue(p_juros, vVal_Juros);
cmdInsert.Parameters.AddWithValue(p_total, vTotal);

cmdInsert.ExecuteNonQuery();

cmdInsert.Dispose();
conexao.Close();

return true;
}
Responder

20/07/2012

Joel Rodrigues

Legal, que bom que deu certo.
Boa sorte.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar