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