Usuário com melhor resposta
Convert está comendo o ponto(.)

Pergunta
-
Preciso converter string em double. Já 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 pont 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.
Respostas
-
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;
}- Marcado como Resposta pnet segunda-feira, 23 de julho de 2012 12:30
Todas as Respostas
-
pNet seu computador está com a cultura para o formato nacional ?
se não, faça assim
System.Globalization.CultureInfo cult = new System.Globalization.CultureInfo("pt-BR"); string valor = "1234,25"; double valorConvertido = double.Parse(valor); //valorConvertido = 1234.25
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :) -
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? -
Olavo, se faço assim:
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
-
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); -
se o tipo no SQL for money ele irá fazer os devidos arredondamentos se não faça assim:
System.Globalization.CultureInfo cult = new System.Globalization.CultureInfo("pt-BR"); string valor = "7,30999999999996"; decimal valorDecimal = decimal.Parse(valor); valorDecimal = Math.Round(valorDecimal, 2, MidpointRounding.AwayFromZero);
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Sugerido como Resposta Romy Moura quinta-feira, 19 de julho de 2012 13:21
-
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? -
Consegui trazer os valores, mas tem um problema. Esses valores alimentam um método e eles são passados como parâmetro. Acontece que na minha classe onde eu insiro os valores no BD, eu faço via StringBuilder, tipo:
StringBuilder sb = new StringBuilder();
sb.AppendLine("insert into tbl_darf values('" + vTrim + "','" + vPag_Ate + "','" + vPer_Apura + "','" + vCnpj + "','" + vCod_Receita + "','" + vNum_Ref + "','" + vDt_Vencto + "'," +vVal_Principal + "," + vVal_Multa + "," + vVal_Juros + "," + vTotal+")");
SqlConnection conexao = new SqlConnection();
conexao.ConnectionString = ConfigurationManager.ConnectionStrings["conectDarf"].ConnectionString;
this.cmd = new SqlCommand(sb.ToString(), conexao);
conexao.Open();
cmd.ExecuteNonQuery();
conexao.Close();Acontece que os parâmteros double estão passando com vírgula e não ponto, mas eles chegam com ponto e não vírgula. Porque será que o stringbuilder está trocando os pontos pelas vírgulas? Alguém tem uma idéia?
-
Ok, seguindo orientação do Joel(Outro forum), 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;
} -
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;
}- Marcado como Resposta pnet segunda-feira, 23 de julho de 2012 12:30
-
Amigo, bom dia.
Você poderia marcar como respostas os post que lhe ajudaram a resolver o problema descrito por esta thread ?
obrigado
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)