Skip to content

Instantly share code, notes, and snippets.

@mupkoo
Created April 7, 2017 08:02
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save mupkoo/4a365f87fa8b05c3673a61fb149f686a to your computer and use it in GitHub Desktop.
Save mupkoo/4a365f87fa8b05c3673a61fb149f686a to your computer and use it in GitHub Desktop.
PHP script to convert numbers to words in Bulgarian
<?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;
}
}
@paskoni
Copy link

paskoni commented Apr 3, 2023

Като цяло работи, но е бъгаво. Напр.:
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) " сто деветнадесет лева и петдесет и осем стотинки"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment