Pretvaranje brojčanog iznosa u slova

Pošto nisam našao prikladnu klasu za PHP koja pretvara brojeve u naša slova, točnije iznose u kunama i lipama, napisao sam ovu klasu. Ako je potrebno kod izrade faktura ili nešto slično, može se slobodno skinuti i upotrijebiti. Klasa funkcionira do milion kuna, točnije 999999,99 kn, ako netko barata sa većim iznosima, čestitam. :-) Naravno, nije teško doraditi klasu za veće iznose. Ispis iznosa trebalo je prilagoditi našem jeziku, koji ima svoje gramatičke specifičnosti. Decimalni razmak može biti točka ili zarez, a nije predviđen unos koji odvaja tisuće, npr. deset tisuća treba biti proslijeđeno kao 10000, ne kao 10.000. Također, potrebno je proslijediti broj koji ima 2 decimale, npr. 12500.55. Klasa očekuje broj koji ima 2 decimale. Klasa se koristi na jednostavan način. Npr ako smo klasu nazvali Class_brojuslova.php, kod koji stvara objekt može biti slijedeći:

<?php
 
require_once 'Class_brojuslova.php';
$a = 500;

$obj = new Class_brojuslova();
$broj = $obj->upravljac($a);

echo
$broj; // print: petstokuna
?>
Ako koristite framework, primjer za Codeigniter 1.7 unutar neke metode bio bi ovakav:
<?php
 
 
// inicijalizacija klase class_brojuslova koja se nalazi u library
   
$this->load->library('class_brojuslova');
   
$brojzaslova = "500.35";

   
// pretvaranje broja u slova preko klase koja se nalazi u library
   
$data['sumslovima'] = $this->class_brojuslova->upravljac($brojzaslova);
   
// prosljeđujemo podatke u view:
   
$this->load->view('ispis_view', $data);
?>
Ovo je sadržaj klase Class_brojuslova.php koja upravlja cijelim procesom.
<?php
 
class Class_brojuslova {
   
    var
$a;
   
    function
upravljac($a) {
       
$slovima = "";
       
$jednatisuca = 0
   
// razdvaja broj na kune i lipe. Može biti decimala ili ne, moze biti točka za decimalu, ili zarez
       
if(strpos($a, ".")) {
            list(
$kuna, $lipa) = explode(".", $a);
        }
        elseif(
strpos($a, ",")) {
            list(
$kuna, $lipa ) = explode(",", $a);
        }
        else {
           
$kuna = $a;
           
$lipa = 0;
         }

       
// koliko znamenki imamo za kune ?
       
$duzinakuna = strlen($kuna);
       
        if(
$duzinakuna > 6) {
            echo
"Sorry, preko milion kuna još ne obrađujemo, obratite se administratoru! ";
            exit;
        }

       
// od 100000 - 999999; dosta za danas...
       
if($duzinakuna == 6) {
           
$sestaznamenka = substr($kuna, -6, 1);
               
           
$slovima = $this->stododevetsto($sestaznamenka);
           
// idemo na slijedecu decimalu
           
$duzinakuna = 5;
        }

       
// od 10000-100000
       
if($duzinakuna == 5) {
           
$petaznamenka = substr($kuna, -5, 1);
           
            if(
$petaznamenka == 1) {
               
$petaznamenka = substr($kuna, -5, 2);
               
$tmpslovima $this->desetdodvadeset($petaznamenka, "tisuća");
       
               
$slovima = $slovima."".$tmpslovima;   
               
               
// preskače slijedeci dio o desetinama tisuca, ide na stotine
               
$duzinakuna = 3;
            }
            else {
               
$tmpslovima $this->dvadesetdosto($petaznamenka, "tisuća");

               
$slovima = $slovima."".$tmpslovima;
   
               
// ide na dio od 1-9 (tisuca)
               
$duzinakuna = 4;
               
$jednatisuca = 1;
            }
           
        }

       
// od 1000-9999
       
if($duzinakuna == 4) {
           
$cetvrtaznamenka = substr($kuna, -4, 1);
           
            if(
$cetvrtaznamenka == 0) {
               
$tmpslovima = "tisuća";

               
$slovima = $slovima."".$tmpslovima;   
               
            }
            elseif(
$cetvrtaznamenka == 1) {
                if(
$jednatisuca == 1) {
                   
$tmpslovima "jednatisuća";

                   
$slovima = $slovima."".$tmpslovima;   
               
                }
                else {
                   
$tmpslovima = "tisuću";

                   
$slovima = $slovima."".$tmpslovima;   
                }   
            }

            elseif(
$cetvrtaznamenka > 1) {
                   
$tisuce  = $this->brojdodeset($cetvrtaznamenka, "tisuća");
                   
$slovima = $slovima."".$tisuce;   
                   
            }           
           
// ide na slijedeci upit za stotine
           
$duzinakuna = 3;
        }

       
// od 100-999
       
if($duzinakuna == 3) {
               
$trecaznamenka = substr($kuna, -3, 1);
               
$stotina $this->stododevetsto($trecaznamenka);
           
               
$slovima = $slovima."".$stotina;   
        }

       
// od 1-99
       
$prvadvakuna = $this->kunelipe($kuna, "kuna");
        if(
$prvadvakuna == NULL) {
           
$prvadvakuna[0] = "kuna";
           
$prvadvakuna[1] = "";
        }
       
       
$slovima = $slovima."".$prvadvakuna[0]."".$prvadvakuna[1];

       
// ima decimalu, tj.lipe, vrati naziv
           
if($lipa > 0) {
               
$b = $this->kunelipe($a, "lipa");
               
$tmplipe = "&nbsp;".$b[0]."".$b[1];

               
$slovima = $slovima."".$tmplipe;   
        }
       
// ovo je potrebno ako cesto mijanjemo iznose u racunu, zapamti veci iznos
       
unset($jednatisuca);
        return
$slovima;
    }

    function
kunelipe($x, $kunalipa)  {
           
$prvadva = substr($x, -2);
            if(
$prvadva > 0) {
               
$prvadva_arr = array();
               
// pokreni function brojuslova i vrati lipe
               
if($prvadva > 0 && $prvadva < 10) {
                   
$prvadva_arr[0] = $this->brojdodeset(substr($x, -1), $kunalipa);
                   
$prvadva_arr[1] = "";
               
                    return
$prvadva_arr;
                }
                elseif(
$prvadva >= 10 && $prvadva < 20) {
                   
$prvadva_arr[0] = $this->desetdodvadeset(substr($x, -2), $kunalipa);
                   
$prvadva_arr[1] = "";
                   
                    return
$prvadva_arr;
                }
                elseif(
$prvadva >= 20 && $prvadva < 100) {
                   
$prvadva_arr[0] = $this->dvadesetdosto(substr($x, -2, 1), $kunalipa);
                   
$prvaznamenka = substr($x, -1);
                    if(
$prvaznamenka == 0) {
                       
$prvadva_arr[1] = $kunalipa;
                    }
                    else {
                       
$prvadva_arr[1] = $this->brojdodeset($prvaznamenka, $kunalipa);                   
                    }
                   
                    return
$prvadva_arr;               
                }
            }       
    }

    function
brojdodeset ($x, $kunalipa) {
           
        switch(
$x) {
            case
0;
                return
" ";
            break;
            case
1;
                return
"jedna".$kunalipa;
            break;
            case
2;
                if(
$kunalipa == "kuna") {
                    return
"dvijekune";
                }
                elseif(
$kunalipa == "lipa") {
                    return
"dvijelipe";
                }
                elseif(
$kunalipa == "tisuća") {
                    return
"dvijetisuće";
                    }
            break;
            case
3;
                if(
$kunalipa == "kuna") {
                    return
"trikune";
                }
                elseif(
$kunalipa == "lipa") {
                    return
"trilipe";
                }
                elseif(
$kunalipa == "tisuća") {
                    return
"tritisuće";
                }
            break;
            case
4;
                if(
$kunalipa == "kuna") {
                    return
"četirikune";
                }
                elseif(
$kunalipa == "lipa") {
                    return
"četirilipe";
                }
                elseif(
$kunalipa == "tisuća") {
                        return
"četiritisuće";
                }
            break;
            case
5;
                return
"pet".$kunalipa;
            break;
            case
6;
                return
"šest".$kunalipa;
            break;
            case
7;
                return
"sedam".$kunalipa;
            break;
            case
8;
                return
"osam".$kunalipa;
            break;
            case
9;
                return
"devet".$kunalipa;
            break;
        }
    }

    function
desetdodvadeset ($x,$kunalipa) {
            switch(
$x) {
                case
10;
                    return
"deset".$kunalipa;
                break;
                case
11;
                    return
"jedanaest".$kunalipa;
                break;
                case
12;
                    return
"dvanaest".$kunalipa;
                break;
                case
13;
                    return
"trinaest".$kunalipa;
                break;
                case
14;
                    return
"četrnaest".$kunalipa;
                break;
                case
15;
                    return
"petnaest".$kunalipa;
                break;
                case
16;
                    return
"šesnaest".$kunalipa;
                break;
                case
17;
                    return
"sedamnaest".$kunalipa;
                break;
                case
18;
                    return
"osamnaest".$kunalipa;
                break;
                case
19;
                    return
"devetnaest".$kunalipa;
                break;       
            }
    }

    function
dvadesetdosto($x) {
        switch(
$x) {
            case
2;
                return
"dvadeset";
            break;   
            case
3;
                return
"trideset";
            break;
            case
4;
                return
"četrdeset";
            break;
            case
5;
                return
"pedeset";
            break;
            case
6;
                return
"šestdeset";
            break;
            case
7;
                return
"sedamdeset";
            break;
            case
8;
                return
"osamdeset";
            break;
            case
9;
                return
"devedeset";
            break;   
        }
    }

    function
stododevetsto ($x) {
            switch(
$x) {
            case
1;
                return
"sto";
            break;   
            case
2;
                return
"dvjesto";
            break;   
            case
3;
                return
"tristo";
            break;   
            case
4;
                return
"četiristo";
            break;   
            case
5;
                return
"petsto";
            break;   
            case
6;
                return
"šesto";
            break;   
            case
7;
                return
"sedamsto";
            break;   
            case
8;
                return
"osamsto";
            break;   
            case
9;
                return
"devetsto";
            break;   
            }
    }
}
?>