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)
[1] jozosandy
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
[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
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
[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