Konverzija vrednosti u dinarima u tekst

U Srpskom jeziku, za razliku od Engleskog, zbog gramatike prilično je komplikovano uraditi, kako to neki nazivaju preslovljavanje, odnosno konverziju broja u tekstualni oblik koji je pogodan za prikaz na računima, predračunima itd.

Šta zapravo ova funkcija radi? Za zadati broj, vraća isti taj broj prikazan u tekstualnom obliku. Npr:

Za zadati broj: 123456.78
Funkcija vraća: stodvadesettrihiljadečetirstopedesetsest dinara i 78/100

Ova funkcija podržava brojeve do 999999999999999999999999999.99, odnosno

devetsto devedeset devet kvadriliona devetsto devedeset devet trilijardi devetsto devedeset devet triliona devetsto devedeset devet bilijardi devetsto devedeset devet biliona devetsto devedeset devet milijardi devetsto devedeset devet miliona devetsto devedeset devet hiljada devetsto devedeset devet dinara i 99/100

Takođe, podržava pozitivne i negativne brojeve, podešavanje decimalnih separatora i separatora za hiljade, a još jedna zgodna stvar je i SpaceLevel parametar koji određuje gde će se ubacivati space karakteri u tekst (više o ovome malo kasnije).

Evo je i funkcija rađena u PHP-u:

function Currency2Txt ($s, $decimalseparator, $thousandsseparator, $spacelevel) {
    $jedinice = array (
        0 => array ( 0 => '', 1 => 'jedna', 2 => 'dve', 3 => 'tri', 4 => 'četiri',
            5 => 'pet', 6 => 'šest', 7 => 'sedam', 8 => 'osam', 9 => 'devet',
            10 => 'deset', 11 => 'jedanaest', 12 => 'dvanaest', 13 => 'trinaest', 14 => 'četrnaest',
            15 => 'petnaest', 16 => 'šesnaest', 17 => 'sedamnaest', 18 => 'osamnaest', 19 => 'devetnaest'),
        1 => array ( 0 => '', 1 => 'jedan', 2 => 'dva', 3 => 'tri', 4 => 'četiri',
            5 => 'pet', 6 => 'šest', 7 => 'sedam', 8 => 'osam', 9 => 'devet',
            10 => 'deset', 11 => 'jedanaest', 12 => 'dvanaest', 13 => 'trinaest', 14 => 'četrnaest',
            15 => 'petnaest', 16 => 'šesnaest', 17 => 'sedamnaest', 18 => 'osamnaest', 19 => 'devetnaest')
    );

    $desetice = array (
        2 => 'dvadeset', 3 => 'trideset', 4 => 'četrdeset', 5 => 'pedeset',
        6 => 'šezdeset', 7 => 'sedamdeset', 8 => 'osamdeset', 9 => 'devedeset'
    );

    $stotine = array (
        0 => '', 1 => 'sto', 2 => 'dvesta', 3 => 'trista', 4 => 'četirsto',
        5 => 'petsto', 6 => 'šesto', 7 => 'sedamsto', 8 => 'osamsto', 9 => 'devetsto'
    );

    $sl = array (
        0 => array ( 1 => '', 2 => '', 3 => '', 4 => '', 5 => '', 6 => '' ),
        1 => array ( 1 => '', 2 => ' ', 3 => '', 4 => '', 5 => '', 6 => '' ),
        2 => array ( 1 => ' ', 2 => ' ', 3 => '', 4 => '', 5 => '', 6 => '' ),
        3 => array ( 1 => ' ', 2 => ' ', 3 => ' ', 4 => '', 5 => '', 6 => '' ),
        4 => array ( 1 => ' ', 2 => ' ', 3 => ' ', 4 => ' ', 5 => '', 6 => '' ),
        5 => array ( 1 => ' ', 2 => ' ', 3 => ' ', 4 => ' ', 5 => ' ', 6 => '' ),
        6 => array ( 1 => ' ', 2 => ' ', 3 => ' ', 4 => ' ', 5 => ' ', 6 => ' '),
    );

    $prilozi = array (
        1 => array (-1 => $sl [$spacelevel][1].'dinar', 0 => 'a', 1 => '', 2 => 'a', 3 => 'a', 4 => 'a', 5 => 'a'),
        2 => array (-1 => 'hiljad', 0 => 'a', 1 => 'a', 2 => 'e', 3 => 'e', 4 => 'e', 5 => 'a'),
        3 => array (-1 => 'milion', 0 => 'a', 1 => '', 2 => 'a', 3 => 'a', 4 => 'a', 5 => 'a'),
        4 => array (-1 => 'milijard', 0 => 'i', 1 => 'a', 2 => 'e', 3 => 'e', 4 => 'e', 5 => 'i'),
        5 => array (-1 => 'bilion', 0 => 'a', 1 => '', 2 => 'a', 3 => 'a', 4 => 'a', 5 => 'a'),
        6 => array (-1 => 'bilijard', 0 => 'i', 1 => 'a', 2 => 'e', 3 => 'e', 4 => 'e', 5 => 'i'),
        7 => array (-1 => 'trilion', 0 => 'a', 1 => '', 2 => 'a', 3 => 'a', 4 => 'a', 5 => 'a'),
        8 => array (-1 => 'trilijard', 0 => 'i', 1 => 'a', 2 => 'e', 3 => 'e', 4 => 'e', 5 => 'i'),
        9 => array (-1 => 'kvadrilion', 0 => 'a', 1 => '', 2 => 'a', 3 => 'a', 4 => 'a', 5 => 'a'),
    );

    $stoti = '';
    $trojka = '';
    $temp = '';
    $predznak = '';
    $result = '';
    $x = 0;

    $s = str_replace($thousandsseparator, '', $s);

    if (substr ($s, 0, 1) == '-') {
        $predznak = 'minus';
        $s = substr ($s, 1);
    }

    if (strpos ($s, $decimalseparator)) {
        $delovi = explode ($decimalseparator, $s);
        $s = $delovi[0];
        $stoti = $delovi[1];
        unset ($delovi);
        if (strlen ($stoti) < 2) { $stoti = $stoti.'0'; } if (strlen ($stoti) > 2) { $stoti = substr ($stoti, 0, 2); }
    }

    while (strlen ($stoti) < 2) { $stoti = '0'.$stoti; };
    if ($s == 0) {
        $result = 'nula'.$sl &#91;$spacelevel&#93;&#91;1&#93;.'dinara';
        if ($stoti == '00') { $predznak = ''; }
    } else {
        while (strlen ($s) % 3 != 0) { $s = '0'.$s; }
        $result = '';
        for ($x=1; $x <= 9; $x++) {
            $trojka = substr ($s, -3);
            $s = substr ($s, 0, -3);
            if ($trojka == '') { $trojka = '000'; }

            if ($trojka != '000') {
                $idx = $x % 2;
                if ((substr ($trojka, 1, 1) == '0') or (substr ($trojka, 1, 1) == '1')) {
                    $temp = $sl&#91;$spacelevel&#93;&#91;6&#93;.$jedinice &#91;$idx&#93;&#91;(int) (substr ($trojka, 1, 1).substr ($trojka, 2, 1))&#93;;
                } else {
                    $temp = $sl&#91;$spacelevel&#93;&#91;6&#93;.$desetice &#91;(int) (substr ($trojka, 1, 1))&#93;.$sl&#91;$spacelevel&#93;&#91;6&#93;.$jedinice&#91;$idx&#93;&#91;(int) (substr($trojka, 2, 1))&#93;;
                }
                $temp = $stotine&#91;substr($trojka, 0, 1)&#93;.$temp;
                if (((int) (substr ($trojka, 1, 1).substr ($trojka, 2, 1)) <= 5) Or ((int) (substr ($trojka, 1, 1).substr ($trojka, 2, 1)) > 20)) {
                    if ((int) (substr($trojka, 2, 1)) <= 5) {
                        $temp = $temp.$sl&#91;$spacelevel&#93;&#91;5&#93;.$prilozi &#91;$x&#93;&#91;-1&#93;.$prilozi &#91;$x&#93;&#91;(int) (substr($trojka, 2, 1))&#93;;
                    } else {
                        $temp = $temp.$sl&#91;$spacelevel&#93;&#91;5&#93;.$prilozi &#91;$x&#93;&#91;-1&#93;.$prilozi &#91;$x&#93;&#91;5&#93;;
                    }
                } else {
                    $temp = $temp.$sl&#91;$spacelevel&#93;&#91;5&#93;.$prilozi &#91;$x&#93;&#91;-1&#93;.$prilozi &#91;$x&#93;&#91;5&#93;;
                }
                $result = $sl&#91;$spacelevel&#93;&#91;4&#93;.$temp.$result;
            } else {
                if ($x == 1) {
                    $result = $result.$sl &#91;$spacelevel&#93;&#91;1&#93;.'dinara';
                }
            }
        }
    }
    return ($predznak.$sl &#91;$spacelevel&#93;&#91;3&#93;.$result.$sl &#91;$spacelevel&#93;&#91;2&#93;.'i'.$sl &#91;$spacelevel&#93;&#91;2&#93;.$stoti.'/100');
}&#91;/php&#93;</pre>


Primer korišćenja funkcije:

echo Currency2Txt('-123,456.78', '.', ',', 3);

Objašnjenje parametara funkcije:

$s - Broj koji se konvertuje (može da ima - predznak)
$decimalseparator - Separator decimale
$thousandseparator - Separator za hiljade, ako ne postoji staviti prazan string
$spacelevel - Broj u opsegu od 0-6 koji određuje gde se postavljaju space karakteri. Svaki sledeći nivo obuhvata i ceo prethodni.

  • 0 - Nigde se ne postavljaju
    npr: minusjedanmilionpetstošezdesetšesthiljadatristatridesettridinarai00/100
  • 1 - Postavljaju se u delu "i xx/100
    npr: minusjedanmilionpetstošezdesetšesthiljadatristatridesettridinara i 00/100
  • 2 - Postavljaju se ispred reči dinara
    npr: minusjedanmilionpetstošezdesetšesthiljadatristatridesettri dinara i 00/100
  • 3 - Postavljaju se ispred predznaka minus
    npr: minus jedanmilionpetstošezdesetšesthiljadatristatridesettri dinara i 00/100
  • 4 - Postavlja se na mesto gde bi bio postavljem separator hiljada
    npr: minus jedanmilion petstošezdesetšesthiljada tristatridesettri dinara i 00/100
  • 5 - Postavlja se ispred reči hiljada, miliona, milijardi itd.
    npr: minus jedan milion petstošezdesetšest hiljada tristatridesettri dinara i 00/100
  • 6 - Postavlja se između svake reči
    npr: minus jedan milion petsto šezdeset šest hiljada trista trideset tri dinara i 00/100

Što se tiče imenovanja brojeva, urađeno je prema SI sistemu jedinica za pefikse (duga skala).

Ako pri korišćenju ove funkcije dobijate žvrljotine umesto YU slova, proverite da li ste u HEAD stavili

&lt;meta charset="utf-8"&gt;

Leave a Reply

Your email address will not be published. Required fields are marked *