DevSecOpsARTIGO

Formatar moeda utilizando CurrencyFormatter

Este artigo é uma sugestão dos leitores Diego Feijó e Maicon Pinto, que precisavam formatar moeda no Flex.

Existem dois modos para formatar moedas no Flex. O primeiro deles é formatar enquanto o usuário digita. Na verdade isso não é um formato, é chamado de Mask Input, e não será visto neste artigo.

O segundo meio é formatar o valor após a sua digitação, ou quando o valor retorna do banco de dados, que é feito com precisão através das classes do mx:formatters.

Vamos criar um formatador básico e ir melhorando-o, conforme situações peculiares possam ir surgindo.

Primeiramente temos que criar um objeto que representa o formatador. Veja:

 <mx:CurrencyFormatter id="MoedaFormatter" precision="2" <br />currencySymbol="R$" decimalSeparatorTo="," decimalSeparatorFrom=","  <br />thousandsSeparatorFrom="." thousandsSeparatorTo="."/>

Utilizando o CurrencyFormatter, definimos diversas propriedades:

Propriedades

precision Define a precisão (centavos) na formatação da moeda. 
currencySymbol Define o símbolo que será inserido na formatação. neste caso, usamos R$
decimalSeparatorTo Define qual o separador de centavos que será inserido no valor formatado
decimalSeparatorFrom Define qual o separador de centavos de entrada, antes de ser formatado
thousandsSeparatorFrom Define qual o separador de milhares de entrada, antes de ser formatado
thousandsSeparatorTo Define qual o separador de milhares de saída, após a formatação

Formatando valores após a digitação

Baseado nesta configuração, podemos formatar um número para moeda. Para isso, o objeto Formatter possui um método chamado “format”, que possui um atributo de entrada e retorna o dado formatado. No exemplo a seguir, criamos um TextInput que possui os dados formatados quando o componente  perde o foco.

<br /> <mx:CurrencyFormatter id="MoedaFormatter" precision="2" <br />    currencySymbol="R$" decimalSeparatorTo="," decimalSeparatorFrom=","  thousandsSeparatorFrom="." thousandsSeparatorTo="."/><br /><br /> <mx:TextInput id="valor" text="" width="100"><br /> 	<mx:focusOut><br /> 		<![CDATA[<br /> 			this.valor.text = MoedaFormatter.format(this.valor.text);<br /> 		]]><br /> 	</mx:focusOut><br /> </mx:TextInput> 

Neste código atribuímos o formatador à saída do cursor (focus out). O primeiro problema deste modo é a inserção do símbolo de moeda R$, pois quando retornamos ao código, o símbolo continua lá, o que pode gerar erros. Conseguimos resolver esse problema utilizando um outro formatador, atribuído ao evento focus in:

<br /> <mx:CurrencyFormatter id="MoedaFormatter" precision="2" <br />    currencySymbol="R$" decimalSeparatorTo="," decimalSeparatorFrom=","  thousandsSeparatorFrom="." thousandsSeparatorTo="."/><br /><br /> <mx:CurrencyFormatter id="MoedaFormatterWithoutCurrency" precision="2" <br />    currencySymbol="" decimalSeparatorTo="," decimalSeparatorFrom=","  thousandsSeparatorFrom="." thousandsSeparatorTo="."/><br /><br /> <mx:TextInput id="valor" text="" width="100"><br /> 	<mx:focusOut><br /> 		<![CDATA[<br /> 			this.valor.text = MoedaFormatter.format(this.valor.text);<br /> 		]]><br /> 	</mx:focusOut><br /> 	<mx:focusIn><br /> 		<![CDATA[<br /> 			this.valor.text = MoedaFormatterWithoutCurrency.format(this.valor.text);<br /> 		]]><br /> 	</mx:focusIn><br /> </mx:TextInput>

Assim, quando o campo recebe o foco, o valor é formatado e o símbolo R$ é retirado.

Formatando valores do banco de dados – Decimal(10,2)

Outro tipo de formatação de moeda é realizada através de valores que são retornados do banco de dados. Geralmente, os valores monetários que ficam armazenados em banco de dados possuem “ponto” como separador de decimal, e não possuem separador de milhar. Ou seja, o valor R$ 5.123,44 é representado no banco de dados como 5123.44

No código a seguir criamos um formatter que poderá ser utilizado para formatar moedas vindos do banco de dados.

        <br /> <mx:CurrencyFormatter id="MoedaFormatterDB" precision="2" <br />    currencySymbol="R$" decimalSeparatorTo="," decimalSeparatorFrom="."  thousandsSeparatorFrom="" thousandsSeparatorTo="."/><br /><br /><mx:TextInput id="valorDB" text="" width="100"/><br /><br /><mx:Button id="btnSetMoedaFromDB" width="300" label="Setar Moeda from DB"><br />	<mx:click><br />		<![CDATA[<br />			this.valorDB.text = MoedaFormatterDB.format(5123.44);<br />		]]><br />	</mx:click><br /></mx:Button>       

Quando clicamos no botão, usamos o método format do Formatter para que o valor “5123.44” seja formatado corretamente.

Dicas

  • Sempre que o formatador limpar a caixa de texto, significa que algum erro aconteceu, você deve revisar o Formatter ou os caracteres digitados a procura de erros.
  • Não coloque valores iguais para os separadores de decimal e separadores de milhar. Vai dar problema!! 
  • Você pode restringir a caixa de texto para que somente números possam ser digitados. Basta incluir a propriedade restrict=”0-9″ no mx:textinput. Isso evita muitos erros de digitação.
  • Caso deseje aprender mais sobre este artigo, você pode
    acessar a documentação do Flex que está neste endereço:http://livedocs.adobe.com/flex/3/langref/mx/formatters/package-detail.html

trabalha com desenvolvimento web desde 1998 e atualmente dedica-se a escrever livros sobre programação e desenvolvimento de sistemas, disponíveis no seu site.

Ver perfil