Memphisto wrote:
> 
> Hi,
> 
>  Is there a way to display big integer numbers splitted by periods in
> PostgreSQL queries?
> 
> Example: 123.456.789 instead of 123456789 .
> 
>                         Thanks in advance

You can create a function to format numbers.

See attached example.

-Jose'-
-- la funzione dec(float) ritorna la parte decimale come un intero
-- la limitazione e' che ha solo 3 cifre arrotondate 000-999
-- purtroppo la differenza tra un float e dtrunc(float) non funziona a
-- dovere, quindi ho usato la funzione date_parte('millisecond',float)
-- che tratta la parte decimale di un float come milisecondi.

drop function dec(float);
create function dec(float) returns text as
'
declare
        txt text;
begin
        --get decimal part...
        txt:= dround(datetime_part(''millisecond'',$1));
        if textlen(txt) = 2 then
                txt:= ''0'' || txt;
        end if;
        if textlen(txt) = 1 then
                txt:= ''00'' || txt;
        end if;
        return txt;
end;
' language 'plpgsql';

-- funzioni per la formattazione di interi e float

drop function format(float4,text);
create function format(float4,text) returns text as
'
begin
        return format(float8($1),$2);
end;
' language 'plpgsql';
drop function format(float8,text);
create function format(float8,text) returns text as
'declare
        fbak text;
        vbak int8;
        out text;
        fout text;
        lh text;
        res1 int8;
        res float8;
        i int2;
        df int2;
        sval text;
begin
        vbak:= dtrunc($1);
        fbak:= $2;
        res:=$1;
        if $1 < 0 then
                res := -(res);
        else
                res := res;
        end if;
       
        df:= textlen(fbak);
        i:= textpos(fbak,'','');
        if i > 0 then
                fbak:= substr(fbak,1,i - 1);
        end if;
        lh:=dec(res);
        fout:= format(vbak,fbak);
        if i = 0 then
                return fout;
        end if;
        out:= fout || ('','');
        out:= out || (substr(lh || ''0000000000000000'',1,df - i));
        return out;
end;
' language 'plpgsql';


drop function format(int8,text);
create function format(int8,text) returns text as
'declare
        fbak text;
        vbak int8;
        out text;
        sign int2;
        num char(1);
        car char(1);
        car1 char(1);
        car0 char(1);
        lf int2;
        bf int2;
        lv int2;
        sval text;
begin
        vbak := $1;
        fbak := $2;


        if vbak < 0 then
                sign := 1;
                vbak := -(vbak);
        else
                sign := 0;
        end if;
        
        lf := textlen(fbak);
        bf := lf;
        sval := vbak;
        lv := textlen(sval);

        if lv > lf then
                raise exception ''the value % is greater than %'',$1,$2;
        end if;

        while (lv>0 or lf>0) loop
                car:= substr(fbak,lf,1);
                car0:= substr(fbak,lf+1,1);
                car1:= substr(fbak,lf - 1,1);

                if lv > 0 then
                        if lf=0 then
                                raise exception ''The value % is greater than 
%'',$1,$2;
                        end if;
                        if car = ''#'' or car = ''&'' then
                                num := substr(sval,lv,1);
                                out := substr(fbak,1,lf - 1) || num;
                                if bf > lf then
                                        fbak := out ||  substr(fbak,lf+1);
                                else
                                        fbak := out;
                                end if;
                                lf := lf - 1;
                                lv := lv - 1;
                        else
                                lf := lf - 1;
                        end if;
                else
                        if sign = 1 then
                                sign :=  2;
                                fbak := substr(fbak,1,lf - 1) || (''-'' || 
substr(fbak,lf + 1));
                        else
                                if sign = 2 or car <> ''&'' then
                                        if car0 = ''-'' or car0 = '' '' then
                                                fbak := substr(fbak,1,lf - 1) || ('' 
'' || substr(fbak,lf + 1));
                                        else
                                                if car1 = ''#'' and (car <> ''#'' and 
car <> ''&'') then
                                                        fbak := substr(fbak,1,lf - 1) 
|| ('' '' || substr(fbak,lf + 1));
                                                else
                                                        if car1 = ''#'' then
                                                                fbak := 
substr(fbak,1,lf - 1) || ('' '' || substr(fbak,lf + 1));
                                                        end if;
                                                end if;
                                        end if;
                                else
                                        if car = ''&'' then
                                                if car0 <> '' '' then
                                                        fbak := substr(fbak,1,lf - 1) 
|| (''0'' || substr(fbak,lf + 1));
                                                else
                                                        fbak := substr(fbak,1,lf - 1) 
|| ('' '' || substr(fbak,lf + 1));
                                                end if;
                                        end if;
                                end if;
                        end if;
                        lf := lf - 1;
                end if;
        end loop;

        return fbak;
end;
' language 'plpgsql';

drop function format(int4,text);
create function format(int4,text) returns text as
'
begin
        return format(int8($1),$2);
end;
' language 'plpgsql';

drop function format(int2,text);
create function format(int2,text) returns text as
'
begin
        return format(int4($1),$2);
end;
' language 'plpgsql';

select format(3112198,'(&&&)##-###'),
       format(311298,'##/##/19##'),
       format(3112198,'#''###''###'),
       format(3112198,'<&&&_&&&_&&&>'),
       format(311,'&''&&&''&&&'),
       format(56789.1234,'&.&&&.###,####'),
       format(3.454,'###,###');
select format(3.004,'###,###');

Reply via email to