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.

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