quarta-feira, 6 de julho de 2016

Formatando com casas decimais

Resultado de imagem para Cultureinfo image
Um problema que enfrentamos no Genexus, na construção de relatórios impressos (PDF, por exemplo), é a impossibilidade de aplicarmos uma mascara que formate milhares e casas decimais a um certo número, isto para que saia dentro dos padrões dos diversos países.

Quando programamos WebPanels e outras interfaces temos alguns recursos que auxiliam na apresentação, como User Controls, Thousand Separator e Pictures, porém quando falamos em impressão PDF os recursos ficam escassos.

Um mesmo valor de 1000 apresentado no sistema Português-Brasil e Americano, deveria resultar em um número apresentado no seguinte formato:

    R$ 1.000,00
    U$ 1,000.00

Infelizmente não conseguimos fazer isso com muita facilidade.

Como Resolver?

Quando esgotamos as possibilidades poderemos então recorrer aos universitários, e existem algumas formas de fazer isso, optei por programar diretamente na linguagem C# que possui uma classe chamada CultureInfo que resolve bem esta parada. A solução final pode ser feita de duas maneiras, programando diretamente no código de nosso procedimento ou mesmo criando uma classe externa na linguagem nativa que importaremos com o External Object.  Ambos os recursos já exploramos aqui no Genexando.

Nosso exemplo seguirá a programação direta no código, porém já salientamos que esta prática não é boa, pois o objeto ficará refém da linguagem programada, e no caso de um novo environment que venha a ser criado posteriormente com outra linguagem de programação estaremos inviabilizando a operação. Cuidado com este tipo de solução porque uma das melhores características do Genexus é a independência tecnológica e este tipo de alternativa afeta de forma significativa a troca de gerador. Se ao invés de programar direto voce optar por uma classe externa com uma DLL que faça a operação, melhor.

Para utilizar a classe CultureInfo será necessário conhecer o código que representa o país e código da região, normalmente formado por duas letras seguida de um hífen e posteriormente o código da região, como por exemplo: pt-BR.

Apresentamos a seguir alguns desses códigos.

en-USEnglish (USA)
pt-BR Portuguese (Brasil)
es-ESSpanish (Spain)
ja-JPJapanese (Japan)
zh-TWChinese (Taiwan)
zh-CNChinese (PRC)
zh-HKChinese (Hong Kong SAR)
zh-SGChinese (Singapore)
zh-MOChinese (Macao SAR)

Programando a coisa

Para programar o formatador precisaremos de uma procedure, que chamaremos de FormatNumber, que definimos com o seguinte:

Rules:
parm(in:&valor, out:&final);

Source:
csharp decimal number = [!&valor!];
csharp [!&final!] = number.ToString("N",new System.Globalization.CultureInfo("en-US"));

Variables:
&valor   Numeric(12.2) // por exemplo!
&final   Character(20)

Utilizando

Para utilizar o conversor será simples, bastando chamar a procedure passando o numero a ser formatado, e recebendo uma string com o valor

&Resultado= FormatNumber(&ValorAFormatar)

O resultado será uma string que poderá ser incorporada ao PDF com o formato da moeda que se deseja apresentar.