Jump to content
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á!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.