Re: [GENERAL] Representation of big integer numbers.

Поиск
Список
Период
Сортировка
От Jose' Soares
Тема Re: [GENERAL] Representation of big integer numbers.
Дата
Msg-id 36A35B64.A3FE4A5@sferacarta.com
обсуждение исходный текст
Ответ на Representation of big integer numbers.  (Memphisto <szoli@netvisor.hu>)
Список pgsql-general
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,'###,###');

В списке pgsql-general по дате отправления:

Предыдущее
От: Blashko Alexander
Дата:
Сообщение: Re: [GENERAL] How to increment by hand a sequence number.
Следующее
От: Memphisto
Дата:
Сообщение: On the int8 type support