none
Convert está comendo o ponto(.) RRS feed

  • 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.

    quinta-feira, 19 de julho de 2012 10:48

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
    sexta-feira, 20 de julho de 2012 00:42

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 :)

    quinta-feira, 19 de julho de 2012 12:13
    Moderador
  • 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?

    quinta-feira, 19 de julho de 2012 12:35
  • 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

    quinta-feira, 19 de julho de 2012 12:45
  • 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);
    quinta-feira, 19 de julho de 2012 12:59
  • 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
    quinta-feira, 19 de julho de 2012 13:02
    Moderador
  • 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?
    quinta-feira, 19 de julho de 2012 13:48
  • 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?

    quinta-feira, 19 de julho de 2012 17:54
  • 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;
            }
    quinta-feira, 19 de julho de 2012 21:29
  • 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
    sexta-feira, 20 de julho de 2012 00:42
  • 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 :)

    segunda-feira, 23 de julho de 2012 11:09
    Moderador