DevSecOps

1 fev, 2010

Formatar moeda utilizando CurrencyFormatter

Publicidade

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" 
currencySymbol="R$" decimalSeparatorTo="," decimalSeparatorFrom=","  
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.


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

<mx:TextInput id="valor" text="" width="100">
<mx:focusOut>
<![CDATA[
this.valor.text = MoedaFormatter.format(this.valor.text);
]]>
</mx:focusOut>
</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:


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

<mx:CurrencyFormatter id="MoedaFormatterWithoutCurrency" precision="2"
currencySymbol="" decimalSeparatorTo="," decimalSeparatorFrom="," thousandsSeparatorFrom="." thousandsSeparatorTo="."/>

<mx:TextInput id="valor" text="" width="100">
<mx:focusOut>
<![CDATA[
this.valor.text = MoedaFormatter.format(this.valor.text);
]]>
</mx:focusOut>
<mx:focusIn>
<![CDATA[
this.valor.text = MoedaFormatterWithoutCurrency.format(this.valor.text);
]]>
</mx:focusIn>
</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.

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

<mx:TextInput id="valorDB" text="" width="100"/>

<mx:Button id="btnSetMoedaFromDB" width="300" label="Setar Moeda from DB">
<mx:click>
<![CDATA[
this.valorDB.text = MoedaFormatterDB.format(5123.44);
]]>
</mx:click>
</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