Ir para conteúdo
BrendonPawn

Formatação de valores monetários

Recommended Posts

Olá, estou meio confuso com questão a formatação de valores monetários usando o controlador 'textBox' no Windows Forms.
Atualmente estou usando o seguinte código no evento Leave da minha textBox:
 

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("pt-BR");
textPreco.Text = (Decimal.Parse(textPreco.Text) / 100).ToString("C");

E eu tenho o resultado esperado para inputs como esses:

1000 => 10,00
1234 => 12,34
199 => 1,99

Ou seja, quando eu alimento a textBox com valores inteiros tudo sai conforme o esperado. Porém se eu informar um valor decimal sai assim:

10,00 => 0,10
12,34 => 0,12
1,99  => 0,02

O mesmo acontece se eu trocar esse trecho de código:

textPreco.Text = (Decimal.Parse(textPreco.Text)/100).ToString("C");

por esse:

textPreco.Text = string.Format("{0:#.00}", Convert.ToDouble(textPreco.Text)/100);

Resumindo eu gostaria de escrever na minha textBox tanto 1000 quanto 10,00 e converter em 10,00 ou R$10,00

Grato desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Após mais algumas pesquisas eu consegui. A solução (caso alguém esteja com o mesmo problema) consiste em criar um controlador personalizado que herda o controlador TextBox. Eu criei uma pasta no diretório do projeto chamada Controls para armazenar meus controladores personalizados e criei dentro dela, uma classe chamada CurrencyBox o código da classe ficou assim:

using System;
using System.Windows.Forms;

namespace MeuProjeto.Controls
{
    class CurrencyBox : TextBox
    {
        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);
            SelectAll();
        }

        protected override void OnLostFocus(EventArgs e)
        {
            base.OnLostFocus(e);
            if (Text.Equals("")) return;
            try
            {
                double valor = Convert.ToDouble(Text.Replace("R$ ", ""));
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("pt-BR");
                if (Text.Contains(","))
                    Text = String.Format("{0:c}", valor);
                else
                    Text = String.Format("{0:c}", Convert.ToDouble(String.Format("{0:#.00}", valor/100)));
            }
            catch
            {
                Focus();
                SelectAll();
            }
        }
    }
}

Após criar a classe, é só depurar a aplicação (Ctrl + Shift + B) e usar o novo controle CurrencyBox na elaboração das forms.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.