Usuário com melhor resposta
Calculadora simples com Asp.Net e C#.

Pergunta
-
Boa tarde! Estou criando uma aplicação Web, que faz cálculos financeiros, só que de forma simples em Asp.net com C#. O meu projeto é para o meu tcc da faculdade. De início deu vários problemas no mesmo lugar. Onde a página não abria. Agora a página abre, mas o problema persiste. Já fiz essa pergunta de outra maneira. Mesmo assim o problema não foi resolvido. Pelo que eu entendi, é algum problema com o mscorlib.dll. Como resolvê-lo? Veja a imagem e o código.
Eu coloquei em a destaque vermelho a mensagem do erro no meu visual studio.
Aqui estão os códigos.
protected void btnInsalubridade_Click(object sender, EventArgs e) { Double SalBase, ResultVlrInsalub; Int16 PorcInsalubridade; SalBase = Convert.ToDouble(string.Format("{C:2}", txtSalBase.Text)); PorcInsalubridade = Convert.ToInt16(txtPorcInsalubridade.Text); ResultVlrInsalub = (SalBase * (PorcInsalubridade / 100)); txtVlrInsalubridade.Text = ResultVlrInsalub.ToString(); return; }
Eu já fiz uma classe em outra camada. Fiz a referência. Chamei a classe pelo dll da outra camada, criei um objeto e instanciei a classe. Até aí tudo certo, quando declarei a variáveis com os respectivos textboxes, deu tudo certo. Mas quando fiz as fórmulas matemáticas através do objeto da classe instanciada, dava erro no mesmo lugar que está dando na variável SalBase. Veja o layout da minha página. Ainda está nas fases iniciais. Depois vou dando uma melhorada.
Desde já sou mui grato por me ajudar a resolver o problema.
Respostas
-
O Double.TryParse já vai tentar fazer a conversão pra você, se conseguir vai retornar true. Veja um exemplo:
Double numerico; bool conseguiuConverter = Double.TryParse("10.00", out numerico); if (conseguiuConverter == true) { //não precisa mais converter, pois numerico agora possui valor = 10 } else { //Notifica o cliente que o valor não é um número válido }
Apesar disso, você ainda pode ter problemas para realizar a conversão, pois em alguns idiomas um decimal válido pode ser 10.00 já em outro 10,00 seria considerado válido. Para resolver isso que você utiliza o CultureInfo. Abaixo criei uma função que vai fazer o TryParse utilizando o CultureInfo
using System.Globalization; ... public static bool parseDouble(string valor, out Double d) { CultureInfo culture = CultureInfo.CreateSpecificCulture("pt-BR"); NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; return Double.TryParse(valor, style, culture, out d); } protected void btnInsalubridade_Click(object sender, EventArgs e) { Double SalBase, ResultVlrInsalub, PorcInsalubridade = 0; if (parseDouble(txtSalBase.Text, out SalBase) && parseDouble(txtPorcInsalubridade.Text, out PorcInsalubridade)) { ResultVlrInsalub = (SalBase * (PorcInsalubridade / 100)); txtVlrInsalubridade.Text = ResultVlrInsalub.ToString(); } else { //Verifique os valores informados nos campos 'SalBase' ou 'PorcInsalubridade' são números válidos } }
- Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 13:44
Todas as Respostas
-
Você está com problema de conversão de Double. A entrada (txtSalBase.Text) está em um formato inválido.
O CultureInfo é uma opção:
https://msdn.microsoft.com/pt-br/library/3s27fasw%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396Uma boa prática é utilizar o TryParse e informar o usuário que o valor digitado é inválido. Seria assim:
//Tenta converter if (!Double.TryParse(txtSalBase.Text, out SalBase)) { //Se não converter entrará aqui e notifica o usuário para que digite no formato correto }
Utilize o CultureInfo e o NumberStyles para fazer a conversão (mais exemplos no link informado acima)
CultureInfo culture = CultureInfo.CreateSpecificCulture("pt-BR"); NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; if (Double.TryParse(txtSalBase.Text, style, culture, out SalBase)) { //funcionou } else { //Se não converter entrará aqui e notifica o usuário para que digite no formato correto }
-
Boa tarde,
Esse erro foi gerado porque o conteúdo do seu TextBox "txtSalBase" não pode ser convertido para Double. Pela segunda imagem (imagem do seu Visual Studio), foi digitado letras, logo são string.
Experimente digitar apenas números nesse TextBox, dessa forma não será gerado erro.
Abs.
Bruno Destro
Dicas de programação em .net, C# e SQL - http://smcode.com.br/
-
-
-
-
Boa tarde! Vi seus códigos, fiz o teste e não deu certo. Depois coloquei esses códigos:
protected void btnInsalubridade_Click(object sender, EventArgs e) { Double SalBase, ResultVlrInsalub, PorcInsalubridade; if (!Double.TryParse(txtSalBase.Text, out SalBase) && !Double.TryParse(txtPorcInsalubridade.Text, out PorcInsalubridade) && !Double.TryParse(txtVlrInsalubridade.Text, out ResultVlrInsalub)) { SalBase = Convert.ToDouble(string.Format("{C:2}", txtSalBase.Text)); PorcInsalubridade = Convert.ToDouble(txtPorcInsalubridade.Text); ResultVlrInsalub = (SalBase * (PorcInsalubridade / 100)); txtVlrInsalubridade.Text = ResultVlrInsalub.ToString(); }
Também não deu certo. O campo txtVlrInsalubridade.Text não é preenchido. Veja as imagens:
-
O Double.TryParse já vai tentar fazer a conversão pra você, se conseguir vai retornar true. Veja um exemplo:
Double numerico; bool conseguiuConverter = Double.TryParse("10.00", out numerico); if (conseguiuConverter == true) { //não precisa mais converter, pois numerico agora possui valor = 10 } else { //Notifica o cliente que o valor não é um número válido }
Apesar disso, você ainda pode ter problemas para realizar a conversão, pois em alguns idiomas um decimal válido pode ser 10.00 já em outro 10,00 seria considerado válido. Para resolver isso que você utiliza o CultureInfo. Abaixo criei uma função que vai fazer o TryParse utilizando o CultureInfo
using System.Globalization; ... public static bool parseDouble(string valor, out Double d) { CultureInfo culture = CultureInfo.CreateSpecificCulture("pt-BR"); NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; return Double.TryParse(valor, style, culture, out d); } protected void btnInsalubridade_Click(object sender, EventArgs e) { Double SalBase, ResultVlrInsalub, PorcInsalubridade = 0; if (parseDouble(txtSalBase.Text, out SalBase) && parseDouble(txtPorcInsalubridade.Text, out PorcInsalubridade)) { ResultVlrInsalub = (SalBase * (PorcInsalubridade / 100)); txtVlrInsalubridade.Text = ResultVlrInsalub.ToString(); } else { //Verifique os valores informados nos campos 'SalBase' ou 'PorcInsalubridade' são números válidos } }
- Marcado como Resposta Marcos SJ segunda-feira, 15 de fevereiro de 2016 13:44
-
Bom dia,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
AtenciosamenteMarcos SJ Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
-
-