Převod matematického čísla na jeho slovní vyjádření

Po listování na jaknaweb.com, jsem narazil na příspěvek ve kterém se uživatel ptá, jak převést v PHP číslo v desítkové soustavě vyjádřené matematicky na číslo vyjádřené slovně. Jelikož mi to přišlo zajímavé tak jsem z dlouhé chvíle navrhl funkci které převádí čísla od 0 do jednoho miliónu. Zbytek ať si udělá každý sám.

Příklady použití

<?php
  echo cisloNaSlovo(999999, true); //(string) devětsetdevadesátdevěttisícdevětsetdevadesátdevět
  echo cisloNaSlovo(123456, true); //(string) stodvacettřitisícčtyřisetpadesátšest
  echo cisloNaSlovo(18, true); //(string) osmnáct
  echo cisloNaSlovo(0); //(bool) false
  echo cisloNaSlovo(0, true); //(string) nula
?>

Kód funkce

<?php
  /*
    * převod desitkového čísla vyjádřeného mattematicky na číslo vyjádřené slovně
    * param int $cislo - číslo v desítkové soustavě (od 0 do 999999)
    * param bool $nula - true:když bude $cislo 0 zobrazí se na výstupu nula; false:když bude $cislo 0 zobrazí se na výstupu (bool)false
    * return string nebo bool false
    * (C) Martin Bumba, http://mbumba.cz
  */
  function cisloNaSlovo($cislo, $nula = false) {
    $jednotky = array("", "jedna","dva","tři","čtyři","pět","šest","sedm","osm","devět");
    $mezi = array(11=>"jedenáct",12=>"dvanáct",13=>"třináct",14=>"čtrnáct",15=>"patnáct",16=>"šestnáct",17=>"sedmnáct",18=>"osmnáct",19=>"devatenáct");
    $desitky = array("", "deset","dvacet","třicet","čtyřicet","padesát","šedesát","sedmdesát","osmdesát","devadesát");
    $cislo = (string) ltrim(round($cislo), 0);
    $delka = strlen($cislo);

    if($cislo==0)  return $nula ? "nula":false;             //ošetření 0
    elseif($delka==1)        return $jednotky[$cislo];  //1 řád - jednotky
    elseif($delka==2) {                                 //2 řády - desítky
      $desitkyAJednotky = $cislo{0}.$cislo{1};
      if($desitkyAJednotky==10) echo "deset";
      elseif($desitkyAJednotky<20) {
        return $mezi[$desitkyAJednotky];
      }
      else {
        return $desitky[$cislo{0}].$jednotky[$cislo{1}];
      }
    }
    elseif($delka==3) {                                 //3 řády - stovky
      if($cislo{0}==1)     return "sto".cisloNaSlovo(substr($cislo,1));
      elseif($cislo{0}==2) return "dvěstě".cisloNaSlovo(substr($cislo,1));
      elseif($cislo{0}==3 OR $cislo{0}==4) return $jednotky[$cislo{0}]."sta".cisloNaSlovo(substr($cislo,1));
      else                 return $jednotky[$cislo{0}]."set".cisloNaSlovo(substr($cislo,1));
    }
    elseif($delka==4) {                                //4 řády - tisíce
      if($cislo{0}==1) return "tisíc".cisloNaSlovo(substr($cislo,1));
      elseif($cislo{0}<5) return $jednotky[$cislo{0}]."tisíce".cisloNaSlovo(substr($cislo,1));
      else             return $jednotky[$cislo{0}]."tisíc".cisloNaSlovo(substr($cislo,1));
    }
    elseif($delka==5) {                                //5 řádů - desítky tisíc
      $desitkyTisic = $cislo{0}.$cislo{1};
      if($desitkyTisic==10)      return "desettisíc".cisloNaSlovo(substr($cislo,2));
      elseif($desitkyTisic<20)   return $mezi[$desitkyTisic]."tisíc".cisloNaSlovo(substr($cislo,2));
      elseif($desitkyTisic<100)  return $desitky[$cislo{0}].$jednotky[$cislo{1}]."tisíc".cisloNaSlovo(substr($cislo,2));
    }
    elseif($delka==6) {                                //6 řádů - stovky tisíc
      if($cislo{0}==1)  {
        if($cislo{1}.$cislo{2}==00)         return "stotisíc".cisloNaSlovo(substr($cislo,3));
        else                                return "sto".cisloNaSlovo(substr($cislo,1));
      }
      elseif($cislo{0}==2)                  return "dvěstě".cisloNaSlovo(substr($cislo,1));
      elseif($cislo{0}==3 OR $cislo{0}==4)  return $jednotky[$cislo{0}]."sta".cisloNaSlovo(substr($cislo,1));
      else                                  return $jednotky[$cislo{0}]."set".cisloNaSlovo(substr($cislo,1));
    }
    return false;
  }
?>

(Naposledy upraveno 22.02.2008 12:45 25.08.2008 12:13)

před 1445 dny, 21. 02. 2008Programování

Komentáře

[1] jozosandy Favicon

Asi by to chcelo zacat pouzivat nejaku ochranu proti spamu…zacina sa ti tu toho objavovat celkom dost.

Zasláno před 1419 dny | Odpovědět
Na komentář reagoval [2] Martin

[2] Martin Favicon

[1] jozosandy: Už to bude snad OK :-).

Zasláno před 1416 dny | Odpovědět

[3] Royce

Super skriptík ;-) ALE… elseif($delka==6) je tam 2× :-) když se pošle číslo 100522 tak se nevypíše sto tisíc ale jenom sto.. proto je třeba přidat podmínku

elseif($delka==6) {                                //6 řádů - stovky tisíc
if($cislo{0}==1) {
    if($cislo{1}.$cislo{2}==00) {
        return "stotisíc".cislo_na_slovo(substr($cislo,3));
    else
        return "sto".cislo_na_slovo(substr($cislo,1));
}
elseif($cislo{0}==2)
    return "dvěstě".cisloNaSlovo(substr($cislo,1));
elseif($cislo{0}==3 OR $cislo{0}==4)
    return $jednotky[$cislo{0}]."sta".cisloNaSlovo(substr($cislo,1));
else
    return $jednotky[$cislo{0}]."set".cisloNaSlovo(substr($cislo,1));
}

Zasláno před 1263 dny | Odpovědět
Na komentář reagoval [5] Admin

[4] Aleš Náprstek

Ona je tam ještě jedna chybička – vyzkoušejte převod čísla 101000

Zasláno před 1262 dny | Odpovědět
Na komentář reagoval [5] Admin

[5] Admin Favicon

[3] Royce: [4] Aleš Náprstek: Již jsem to opravil, ale nevím zda tam ještě nejaká chyba nebude.

Zasláno před 1259 dny | Odpovědět

Zanechat komentář




Antispam