BrendonPawn 2 Report post Posted October 9, 2021 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
BrendonPawn 2 Report post Posted October 9, 2021 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