Transformace částky (čísla) na slovní vyjádření
Skočit na navigaci
Skočit na vyhledávání
K získání slovního vyjádření číselné hodnoty lze použít následující funkci. Číslo je zobrazeno bez mezer (ve tvaru určeném pro složenky). Rozsah funkce je 1..999 999 999. Inspirováno Ondřejem Vanišem, autor Pavel Stěhule.
CREATE OR REPLACE FUNCTION to_char_nw(int) RETURNS varchar AS $$ DECLARE dict varchar[][] = ARRAY[ ARRAY['jedna','dva','tři','čtyři','pět','šest','sedm','osm','devět'], ARRAY['','dvacet','třicet','čtyřicet','padesát','šedesát','sedmdesát','osmdesát','devadesát'], ARRAY['sto','dvěstě','třista','čtyřista','pětset','šestset','sedmset','osmset','devětset'], ARRAY['tisíc','tisíce','tisíce','tisíce','tisíc','tisíc','tisíc','tisíc','tisíc'], ARRAY['milion','miliony','miliony','miliony','milionů','milionů','milionů','milionů','milionů'] ]; dict20 varchar[] = ARRAY['deset','jedenáct','dvanáct','třínáct','čtrnáct', 'patnáct','šestnáct','sedmnáct','osmnáct','devatenáct']; accu varchar = ''; auxi int = $1; stack int; BEGIN WHILE auxi > 0 OR stack IS NOT NULL LOOP stack := COALESCE(stack, CASE WHEN auxi >= 1000 THEN auxi ELSE NULL END); auxi := CASE WHEN auxi >= 1000000 THEN auxi/1000000 WHEN auxi >= 1000 THEN auxi/1000 ELSE auxi END; accu := accu || CASE WHEN auxi >= 100 THEN dict[3][auxi/100] WHEN auxi >= 20 THEN dict[2][auxi/10] WHEN auxi >= 10 THEN dict20[auxi - 9] ELSE CASE WHEN stack IS NULL THEN dict[1][auxi] WHEN stack >= 1000000 THEN CASE WHEN (stack/1000000) = 1 THEN 'jeden' ELSE dict[1][auxi] END WHEN stack >= 1000 THEN CASE WHEN (stack/1000 % 10) = 1 THEN 'jeden' ELSE dict[1][auxi] END END END; auxi := CASE WHEN auxi >= 100 THEN auxi % 100 WHEN auxi >= 20 THEN auxi % 10 ELSE 0 END; IF stack IS NOT NULL AND auxi = 0 THEN SELECT INTO accu, auxi, stack accu || CASE WHEN stack >= 10000000 THEN 'miliónů' WHEN stack >= 1000000 THEN dict[5][stack/1000000] WHEN stack >= 10000 THEN 'tisíc' WHEN stack >= 1000 THEN dict[4][stack/1000] END, CASE WHEN stack >= 1000000 THEN stack % 1000000 WHEN stack >= 1000 THEN stack % 1000 END, NULL; END IF; END LOOP; RETURN CASE WHEN accu <> '' THEN accu ELSE 'nula' END; RETURN accu; END; $$ LANGUAGE plpgsql;
Použití:
postgres=# SELECT to_char_nw(21021); to_char_nw ----------------------------- dvacetjedentisícdvacetjedna (1 row)