Created
April 7, 2017 08:02
-
-
Save mupkoo/4a365f87fa8b05c3673a61fb149f686a to your computer and use it in GitHub Desktop.
PHP script to convert numbers to words in Bulgarian
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Taken from the internet | |
// Slighly modified | |
function _n($single, $plural, $number) { | |
if ((int) $number == 1) { | |
return $single; | |
} else { | |
return $plural; | |
} | |
} | |
function slovom($num, $tri = 0, $saStotinki = false) { | |
$edinici = array( | |
0 => "", | |
1 => array( | |
0 => " един", | |
1 => "", | |
2 => " eдин", | |
3 => " eдин", | |
4 => " eдин", | |
5 => " eдин", | |
6 => " eдин", | |
7 => " eдин", | |
8 => " eдин", | |
9 => " eдин", | |
10 => " eдин", | |
), | |
2 => array( | |
0 => " два", | |
1 => " двe", | |
2 => " два", | |
3 => " два", | |
4 => " два", | |
5 => " два", | |
6 => " два", | |
7 => " два", | |
8 => " два", | |
9 => " два", | |
10 => " два", | |
), | |
3 => " три", | |
4 => " четири", | |
5 => " пет", | |
6 => " шест", | |
7 => " седем", | |
8 => " осем", | |
9 => " девет", | |
10 => " десет", | |
11 => " единадесет", | |
12 => " дванадесет", | |
13 => " тринадесет", | |
14 => " четиринадесет", | |
15 => " петнадесет", | |
16 => " шестнадесет", | |
17 => " седемнадесет", | |
18 => " осемнадесет", | |
19 => " деветнадесет" | |
); | |
if ($saStotinki) { | |
$edinici[1] = array( | |
0 => " една", | |
1 => "", | |
2 => " една", | |
3 => " една", | |
4 => " една", | |
5 => " една", | |
6 => " една", | |
7 => " една", | |
8 => " една", | |
9 => " една", | |
10 => " една", | |
); | |
$edinici[2] = array( | |
0 => " две", | |
1 => " две", | |
2 => " две", | |
3 => " две", | |
4 => " две", | |
5 => " две", | |
6 => " две", | |
7 => " две", | |
8 => " две", | |
9 => " две", | |
10 => " две", | |
); | |
} | |
$desetici = array( | |
0 => "", | |
1 => "", | |
2 => " двадесет", | |
3 => " тридесет", | |
4 => " четиридесет", | |
5 => " петдесет", | |
6 => " шестдесет", | |
7 => " седемдесет", | |
8 => " осемдесет", | |
9 => " деведесет" | |
); | |
$stotici = array ( | |
0 => "", | |
1 => " сто", | |
2 => " двеста", | |
3 => " триста", | |
4 => " четиристотин", | |
5 => " петстотин", | |
6 => " шестстотин", | |
7 => " седемстотин", | |
8 => " осемстотин", | |
9 => " деветстотин", | |
); | |
$tripleti = array( | |
0 => "", | |
1 => array( | |
0 => " хиляда", | |
1 => " хиляди"), | |
2 => array( | |
0 => " милион", | |
1 => " милиона"), | |
3 => array( | |
0 => " билион", | |
1 => " билионa"), | |
4 => array( | |
0 => " трилион", | |
1 => " трилиона"), | |
5 => array( | |
0 => " квадрилион", | |
1 => " квадрилиона"), | |
6 => array( | |
0 => " квинтилион", | |
1 => " квинтилиони"), | |
7 => array( | |
0 => " сикстилион", | |
1 => " сикстилион"), | |
8 => array( | |
0 => " септилион", | |
1 => " септилиони"), | |
9 => array( | |
0 => " октилион", | |
1 => " октилион"), | |
10 => array( | |
0 => " нонилион", | |
1 => " нонилиои") | |
); | |
//взимаме само цялата част от числото, без стойността | |
//след десетичната запетая | |
$n = explode(".", $num); | |
$num = $n[0]; | |
$r = (int) ($num / 1000); | |
$x = ($num / 100) % 10; | |
$y = $num % 100; | |
$str = ""; | |
// стотици | |
if ($x > 0) { | |
$str = $stotici[$x]; | |
} | |
// единици и десетици | |
if ($y < 20) { | |
if($y == 0 && $r > 0) { | |
$str = ' и '.$str; | |
} | |
if(is_array($edinici[$y]) && isset($edinici[$y][$tri])) { | |
$str .= ' '.$edinici[$y][$tri]; | |
} | |
else { | |
$str .= ' '.$edinici[$y]; | |
} | |
} | |
else { | |
if($edinici[$y % 10]) { | |
$str .= $desetici[(int) ($y / 10)]; | |
$str .= ' и'; | |
if(is_array($edinici[$y % 10]) && isset($edinici[$y % 10][$tri])) { | |
$str .= $edinici[$y % 10][$tri]; | |
} | |
else { | |
$str .= $edinici[$y % 10]; | |
} | |
} | |
else { | |
$str .= ' и'.$desetici[(int) ($y / 10)]; | |
} | |
} | |
// добавяне на модификатор - хиляди, милиони, билиони | |
if ($str != "") { | |
//Ако има зададени опции за единствено и мн. число | |
if(is_array($tripleti[$tri])) { | |
//мн. число ли е? | |
if($num > 1) { | |
$str .= $tripleti[$tri][1]; | |
} | |
else { | |
$str .= $tripleti[$tri][0]; | |
} | |
} | |
else { | |
$str .= $tripleti[$tri]; | |
} | |
$str = str_replace('един стотин', 'сто', $str); | |
$str = str_replace('един хиляди', 'хиляда', $str); | |
} | |
//ако сме на първата стъпка (т.е. определяме числото до стотици) | |
if($tri == 0) { | |
//добавяме префикс за лева | |
if (!$saStotinki) { | |
$str .= ' '._n('лев', 'лева', (int) $num); | |
} | |
//и ако има сетнати стотинки ги добавяме и тях | |
if(isset($n[1])) { | |
$stotinki = $n[1]; | |
if (strlen($stotinki) == 1) { | |
$stotinki .= '0'; | |
} | |
$str .= ' и'.slovom($stotinki, 0, true).' '._n('стотинка', 'стотинки', (int) $stotinki); | |
} | |
} | |
// продължаване рекрусивно? | |
if ($r > 0) { | |
return slovom($r, $tri+1).$str; | |
} | |
else { | |
return $str; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Като цяло работи, но е бъгаво. Напр.:
php > var_dump(slovom(1219));
string(62) " хиляда двеста деветнадесет лева"
php > var_dump(slovom(1000.58));
string(77) " хиляда и лева и петдесет и осем стотинки"
php > var_dump(slovom(30229));
string(86) " и тридесет хиляди двеста двадесет и девет лева"
php > var_dump(slovom(31229));
string(86) " тридесет и хиляди двеста двадесет и девет лева"
php > var_dump(slovom(119.58));
string(91) " сто деветнадесет лева и петдесет и осем стотинки"