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