PostgreSQL - Função para mascarar um valor
Assim como criei uma função para mascarar um valor no Maker, tive a necessidade de criar uma para o PostgreSQL com a mesma finalidade.
A função recebe como parâmetro o valor a ser mascarado e a quantidade de casa decimal.
Exemplos:
A função recebe como parâmetro o valor a ser mascarado e a quantidade de casa decimal.
CREATE OR REPLACE FUNCTION public.mascarar_valor(valor NUMERIC, qtd_casa INTEGER)
RETURNS TEXT AS
$$
DECLARE
negativo BOOLEAN := false;
valor_texto TEXT;
parte_inteira TEXT;
parte_decimal TEXT;
tamanho INTEGER;
pos_ponto INTEGER;
BEGIN
--Verifica se é negativo
IF (SIGN(valor) = -1) THEN
negativo := true;
valor := valor * -1;
END IF;
valor := valor * 1.0; --Converte para fracionado (quando vem como inteiro)
valor_texto := CAST(valor AS TEXT); --Converte para texto
tamanho := CHAR_LENGTH(valor_texto); --Obtém tamanho do texto
pos_ponto := STRPOS(valor_texto, '.'); --Obtém posição do ponto
parte_inteira := SUBSTR(valor_texto, 1, (pos_ponto - 1)); --Obtém a parte inteira
parte_decimal := SUBSTR(valor_texto, (pos_ponto + 1), (tamanho - pos_ponto)); --Obtém a parte decimal
parte_inteira := TO_CHAR(CAST(parte_inteira AS NUMERIC),'FM999' || REPEAT('G999', (tamanho / 3))); --Mascara a parte inteira
parte_decimal := RPAD(SUBSTR(parte_decimal, 1, qtd_casa), qtd_casa, '0'); --Trunca e/ou completa a parte decimal
RETURN CASE WHEN negativo THEN '-' ELSE '' END || parte_inteira || ',' || parte_decimal;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;
Exemplos:
SELECT mascarar_valor(1, 2); 1,00 SELECT mascarar_valor(1000.5, 3); 1.000,500 SELECT mascarar_valor(1000.555, 2); 1.000,55 SELECT mascarar_valor(1000000.7, 2); 1.000.000,70 SELECT mascarar_valor(-1000000.7, 2); -1.000.000,70
Comentários
Postar um comentário