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.

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, -61);
                
            
$slovima $this->stododevetsto($sestaznamenka);
            
// idemo na slijedecu decimalu
            
$duzinakuna 5;
        }

        
// od 10000-100000
        
if($duzinakuna == 5) {
            
$petaznamenka substr($kuna, -51);
            
            if(
$petaznamenka == 1) {
                
$petaznamenka substr($kuna, -52);
                
$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, -41);
            
            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, -31);
                                
                
$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 && $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, -21), $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;    
            }
    }

}
?>