Como converter um número para texto formatado
Uma das coisas mais básicas que encontramos na programação é a conversão de número para texto formatado. Isto muitas vezes ocorre porque queremos mostrar ao usuário um número fácil de entender, separando-o com casas de milhar e decimal. Mas no mundo do SQL, infelizmente queries só sabem mostrar o número do jeito que ele é processado, ou seja, 123456789.0987654 não pode ser exibido assim 123.456.789,10 do lado do servidor.
A SQL Function abaixo resolve este problema. Ela possui quatro parâmetros de entrada, sendo três deles opcionais:
- Parâmetro 1: Valor, por exemplo, 123456789.0987654
- Parâmetro 2: Se for usado, indica o número de casas para arredondamento, ex:
GET_FORMAT_FLOAT(123456789.0987654, 2)retornará 123.456.789,10. Se usar número negativo, o arredondamento passará a ser feito na porção inteira do número, ex:GET_FORMAT_FLOAT(123456789.0987654, -2)retornará 123.456.800 (sem parte fração). - Parâmetro 3: Se for usado, indicará o separador de milhar, ex: '.'.
- Parâmetro 4: Se for usado, indicará o separador de decimal, ex: ','.
Se gostou dela, pode usufruir:
CREATE OR ALTER FUNCTION GET_FORMAT_FLOAT (
P_VALUE DOUBLE PRECISION,
P_ROUND INTEGER = -255,
P_SEP_MILHAR VARCHAR(1)='.',
P_SEP_DECIMAL VARCHAR(1)=',')
RETURNS VARCHAR(255)
AS
DECLARE VARIABLE LVALUE_AS_TEXT VARCHAR(255);
DECLARE VARIABLE LTEMP_VAR VARCHAR(255);
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE LCHAR VARCHAR(1);
DECLARE VARIABLE LTEXT_INT VARCHAR(255);
DECLARE VARIABLE LTEXT_DECIMAL VARCHAR(255);
BEGIN
/* Essa função retorna uma string com número formatado a partir de um valor
qualquer, por exemplo, 123456789.0987654 retorna '123.456.789,0987654'.
O segundo parâmetro P_ROUND é para indicar arredondamento de casas, ex:
a=GET_FORMAT_FLOAT(123456789.0987654, 2); -- retorna '123.456.789,10'
Se o segundo parâmetro for negativo então o arredondamento será a partir
dos números inteiros e não há mais fração, ex:
a=GET_FORMAT_FLOAT(123456789.0987654, -2); -- retorna '123.456.800'
Os parâmetros P_SEP_MILHAR e P_SEP_DECIMAL servem para indicar o separador
de milhar e decimal. Exceto o parâmetro de valor, todos os demais são opcionais
by gladiston.santana[em]gmail.com
*/
IF (:P_ROUND<>-255) THEN
BEGIN
LVALUE_AS_TEXT=TRIM(CAST(ROUND(P_VALUE, P_ROUND) AS VARCHAR(255)));
END
ELSE
BEGIN
LVALUE_AS_TEXT=TRIM(CAST(P_VALUE AS VARCHAR(255)));
END
-- A parte decimal deve estar separada, geralmente o decimal é '.' nessas
-- conversões, mas hipoteticamente se não encontrar então procura por ','
-- antes de decidir que se trata de um número inteiro
LTEXT_DECIMAL='';
I=POSITION ('.' IN LVALUE_AS_TEXT);
IF (I=0) THEN
I=POSITION (',' IN LVALUE_AS_TEXT);
IF (I>0) THEN
BEGIN
-- Separando a parte fracionária
LTEXT_DECIMAL=RIGHT(LVALUE_AS_TEXT, CHAR_LENGTH(LVALUE_AS_TEXT)-I);
LVALUE_AS_TEXT=LEFT(LVALUE_AS_TEXT, I-1);
END
-- Iniciará um loop do primeiro ao último caractere na parte inteira
-- acrescentando a milhar a cada 3 caracteres
LTEXT_INT='';
LTEMP_VAR=REVERSE(LVALUE_AS_TEXT);
I=0;
WHILE (ICHAR_LENGTH(LTEMP_VAR))
THEN LTEXT_INT=LTEXT_INT||P_SEP_MILHAR;
END
END
LVALUE_AS_TEXT=REVERSE(LTEXT_INT);
IF (LTEXT_DECIMAL<>'')
THEN LVALUE_AS_TEXT=LVALUE_AS_TEXT||P_SEP_DECIMAL||LTEXT_DECIMAL;
RETURN :LVALUE_AS_TEXT;
END
Conclusão
Com essa função você pode formatar números de forma profissional, facilitando a leitura para os usuários finais e mantendo a formatação consistente em todo o sistema.