none
Problema com mascara de moeda no textbox RRS feed

  • Pergunta

  • Boa Noite galera,

    Eu sou nova na programação..e estou desenvolvendo meu tcc..preciso de ajuda, não tenho mais aonde recorrer....estou com problema na minha mascara de moeda...o campo no banco está como decimal....pra criar a mascara na textbox peguei uma mascara na internet, até ai funciona bem...ele grava no banco direitinho, só que não aceita os centavos...se eu coloco:

    14,30 grava no banco como 14.00

    150,50 grava no banco como 150.00

    a mascara ta assim:

     public static void Moeda(ref TextBox txt)
            {
                    string n = string.Empty;
                    double v = 0;
                    try
                    {
                        n = txt.Text.Replace(",", "").Replace(".", "");
                        if (n.Equals(""))
                            n = "000";
                        n = n.PadLeft(3, '0');
                        if (n.Length > 3 & n.Substring(0, 1) == "0")
                            n = n.Substring(1, n.Length - 1);
                        v = Convert.ToDouble(n) / 100;
                        txt.Text = string.Format("{0:N}", v);
                        txt.SelectionStart = txt.Text.Length;
                    
                    }
                catch (Exception)
                {
    
                }
            }
      //minha textbox   
     private void textBox3_TextChanged(object sender, EventArgs e)
            {
                Moeda(ref textBox3);
            }

    Parece  que tudo que vem depois da  virgula ele zera e grava no banco....mas deveria estar mudando a virgula por ponto   não zerando o que vem depois da virgula...alguém pode me ajudar?


    • Editado Andressa.s terça-feira, 16 de janeiro de 2018 21:05
    terça-feira, 16 de janeiro de 2018 21:04

Respostas

  • kk Não se preocupe..não vou interpretar mal...

    Mas como assim tirar print do banco? da tabela vc fala? ou do codigo "inserir" em c#?

    Tirei print do  messageBox e ele ta inserindo com virgula no banco...ele não ta mudando a virgula pro ponto..acho que por isso ele zera...Olha: (Como resolver isso?)

    Você não está usando o código que passei.

    Use isso:

    string valor = cadast.preco.ToString("0.00").Replace(",", ".");
    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "'," + valor + ")";
    

    Copie e substitua o seu...

    E tente!

    Sim seria um print da tabela onde exiba as propriedades da coluna!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    • Marcado como Resposta Andressa.s quarta-feira, 17 de janeiro de 2018 19:18
    quarta-feira, 17 de janeiro de 2018 19:00
  • Funcionou cara...

    só que eu coloquei direto na string inserir assim:

    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "','" + cadast.preco.ToString("0.00").Replace(",", ".") + "')";
             
    

    Ta  gravando os centavos...

    Muito Obrigado mesmo!

    :)

    • Marcado como Resposta Andressa.s quarta-feira, 17 de janeiro de 2018 19:18
    quarta-feira, 17 de janeiro de 2018 19:18

Todas as Respostas

  • Boa noite Andressa!

    Não tenho como simular o seu código agora, mas dê uma olhada no tipo do seu atributo na tabela.

    Conforme o link abaixo, tenta alterar a precisão do campo Decimal.

    https://docs.microsoft.com/pt-br/sql/t-sql/data-types/decimal-and-numeric-transact-sql

    Eu uso esta escala -> decimal(19,5)

    Me atende bem, mas isso é de acordo com a sua necessidade e o nível de precisão que você precisa recuperar.

    Att., Bernard Johnson

    • Sugerido como Resposta Bernard Johnson P terça-feira, 16 de janeiro de 2018 22:16
    • Não Sugerido como Resposta Andressa.s terça-feira, 16 de janeiro de 2018 22:55
    terça-feira, 16 de janeiro de 2018 22:11
  • Boa Noite moço,

    a minha escala está ->(19,2), mas acho que o erro é no código ainda....mas vou dar uma olhada no link

    :)

    terça-feira, 16 de janeiro de 2018 22:34
  • Mostra o código que está sendo executado para gravar no banco!

    Existe uma possibilidade de algum CAST ou convertendo para um inteiro!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    quarta-feira, 17 de janeiro de 2018 02:00
  • Olá Andressa.s

    Precisamos analisar o Codigo em um todo, principalmente a parte do banco!


    Se ajudei Vote como Útil, se resolvi seu problema clique em Marcar como Resposta.


    Daniel Ribeiro Arrais
    Consultor Sênior
    Site: www.danielarrais.com.br
    Linkedin: http://www.linkedin.com/in/danielarrais
    E-mail: arraishapkido@gmail.com
    Skype: dani.arrais

    quarta-feira, 17 de janeiro de 2018 09:33
  • Bom dia!

    Eu fiz uns testes aqui simulando a entrada de 50,40 com o mesmo código que você postou e está funcionando normalmente.

    Segue o resultado:

    Não sei a necessidade das outras funcionalidades, porém dá pra fazer de outra forma mais enxuto:

    Caso a entrada venha de valor diferente do simulado, posta aí pra gente tentar ajudar.

    Att., Bernard Johnson


    quarta-feira, 17 de janeiro de 2018 10:59
  • Boa  tarde moço,

    No banco o  campo ta como decimal(19.2);

    E a  parte que grava no banco ta assim:

     private decimal npreco;
    
     public decimal preco
            {
                get { return npreco; }
                set { npreco = value; }
            }
    
    //parte que cadastra
    conexao.Open();
    
                    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "','" + cadast.preco + "')";
    
    
    
                    MySqlCommand comandos = new MySqlCommand(inserir, conexao);
    
                    comandos.ExecuteNonQuery();
                    MessageBox.Show("Consulta Cadastrada com Sucesso!");
    
                    conexao.Close();
    
    
    //dentro do botão
    cadas.preco = Convert.ToDecimal(textBox3.Text.Replace("R$",""));
    Ele cadastra  certinho...só que zera o que vem depois da virgula, no caso os centavos..

    quarta-feira, 17 de janeiro de 2018 17:25
  • Boa tarde moço...

    Eu testei desse jeito, e continua da mesma forma...ele fica como 50,40 e grava no banco como 50.00...

    Não sei o que pode ser.

    quarta-feira, 17 de janeiro de 2018 17:40
  • Olá Andressa.s

    Existem muitas outras formas para fazer isso, como por exemplo passar os parâmetros, com seus respectivos tipos, mais para não complicar e ficar redundante, fiz uma pequena modificação em seu código!

    Deixando ele assim:

    public decimal preco { get; set; }
    
    //parte que cadastra
    conexao.Open();
    string valor = cadast.preco.ToString("0.00").Replace(",", ".");
    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "'," + valor + ")";
    
    MySqlCommand comandos = new MySqlCommand(inserir, conexao);
    comandos.ExecuteNonQuery();
    conexao.Close();
    MessageBox.Show("Consulta Cadastrada com Sucesso!");
    
    
    //dentro do botão
    cadas.preco = decimal.Parse(textBox3.Text);

       Espero ter ajudado!

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    quarta-feira, 17 de janeiro de 2018 17:41
  • Andressa.s não é falando que não acredito, favor não interpretar dessa forma!

    Você pode tirar um print da estrutura do banco?

    E colocar um messagebox abaixo do inserir assim:

    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "'," + valor + ")";
    MessageBox.Show(inserir );

    Abraços!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    quarta-feira, 17 de janeiro de 2018 18:05
  • kk Não se preocupe..não vou interpretar mal...

    Mas como assim tirar print do banco? da tabela vc fala? ou do codigo "inserir" em c#?

    Tirei print do  messageBox e ele ta inserindo com virgula no banco...ele não ta mudando a virgula pro ponto..acho que por isso ele zera...Olha: (Como resolver isso?)

    quarta-feira, 17 de janeiro de 2018 18:54
  • kk Não se preocupe..não vou interpretar mal...

    Mas como assim tirar print do banco? da tabela vc fala? ou do codigo "inserir" em c#?

    Tirei print do  messageBox e ele ta inserindo com virgula no banco...ele não ta mudando a virgula pro ponto..acho que por isso ele zera...Olha: (Como resolver isso?)

    Você não está usando o código que passei.

    Use isso:

    string valor = cadast.preco.ToString("0.00").Replace(",", ".");
    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "'," + valor + ")";
    

    Copie e substitua o seu...

    E tente!

    Sim seria um print da tabela onde exiba as propriedades da coluna!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Microsoft Developer .NET
    Microsoft Certified Professional
    Development Leader at JAMSOFT Informática
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    • Marcado como Resposta Andressa.s quarta-feira, 17 de janeiro de 2018 19:18
    quarta-feira, 17 de janeiro de 2018 19:00
  • Funcionou cara...

    só que eu coloquei direto na string inserir assim:

    string inserir = "INSERT INTO procedimentos (Descricao,Preco) values ('" + cadast.descricao + "','" + cadast.preco.ToString("0.00").Replace(",", ".") + "')";
             
    

    Ta  gravando os centavos...

    Muito Obrigado mesmo!

    :)

    • Marcado como Resposta Andressa.s quarta-feira, 17 de janeiro de 2018 19:18
    quarta-feira, 17 de janeiro de 2018 19:18