none
Calculadora simples com Asp.Net e C#. RRS feed

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

    terça-feira, 9 de fevereiro de 2016 15:37

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
    quarta-feira, 10 de fevereiro de 2016 21:38

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=-2147217396

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

    • Sugerido como Resposta SimorC terça-feira, 9 de fevereiro de 2016 19:17
    • Marcado como Resposta Marcos SJ quarta-feira, 10 de fevereiro de 2016 12:41
    • Não Marcado como Resposta Marcos SJ quinta-feira, 11 de fevereiro de 2016 12:01
    terça-feira, 9 de fevereiro de 2016 17:32
  • 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/

    terça-feira, 9 de fevereiro de 2016 18:48
  • Muito obrigado pela resposta. Vou testar os códigos. Qualquer coisa eu comunico.
    quarta-feira, 10 de fevereiro de 2016 09:35
  • Bom dia! Vi seu site. Vou fazer umas pesquisas nele, qualquer coisa te comunico.
    quarta-feira, 10 de fevereiro de 2016 09:40
  • Boa tarde. Como é que faz isso que você me recomendou fazer? Dá para fazer em linhas de códigos?
    quarta-feira, 10 de fevereiro de 2016 19:58
  • 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:

    quarta-feira, 10 de fevereiro de 2016 20:28
  • 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
    quarta-feira, 10 de fevereiro de 2016 21:38
  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

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

    segunda-feira, 15 de fevereiro de 2016 13:45
  • Obrigado pela resposta, vou testar.
    terça-feira, 23 de fevereiro de 2016 13:50
  • Cara! Gostei muito dessas linhas de códigos. Consegui resolver o problema com elas. As vezes não executa. Mas, eu reinício a máquina e termina executando direitinho.
    segunda-feira, 7 de março de 2016 16:00
  • Bom dia, César Cassiano.

    Consegui resolver totalmente o problema. Tive que prestar muita atenção na sintaxe dos códigos. Deu tudo certo, valeu.

    terça-feira, 8 de março de 2016 14:26