Array
(
)

Convert está comendo o ponto(.)

Pjava
   - 19 jul 2012

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.

Valter Furtado
   - 19 jul 2012

acabei de testar aqui...

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

0
|
0

Pjava
   - 19 jul 2012

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?

0
|
0

Pjava
   - 19 jul 2012

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

0
|
0

Joel Rodrigues
   - 19 jul 2012

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.

0
|
0

Joel Rodrigues
   - 19 jul 2012

Porém, caso você deseje ler um valor no formato brasileiro e converter para string no formato americano, veja a seguinte sintaxe:
#Código

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.

0
|
0

Pjava
   - 19 jul 2012

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.

0
|
0

Pjava
   - 19 jul 2012

Joel, desse jeito não funcionou:

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

0
|
0

Pjava
   - 19 jul 2012

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?

0
|
0

Joel Rodrigues
   - 19 jul 2012

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.

0
|
0

Pjava
   - 19 jul 2012

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;
}

0
|
0

Joel Rodrigues
   - 19 jul 2012

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

0
|
0

Joel Rodrigues
   - 19 jul 2012

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.

0
|
0

Pjava
   - 20 jul 2012

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;
}

0
|
0

Joel Rodrigues
   - 20 jul 2012

Legal, que bom que deu certo.
Boa sorte.

0
|
0