Last active
July 21, 2021 12:24
-
-
Save Bellov/23fdef8fefc4c8860f60b3c469fb86ab to your computer and use it in GitHub Desktop.
PHP global helper for convet sum to BG words
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
/* | |
* Convert number to bg words | |
* Example | |
* 1000 => хиляда лева | |
* 1000,2 => хиляда лева и 2 стотинки | |
*/ | |
if (!function_exists('numberToLv')) { | |
function numberToLv($number) | |
{ | |
list($lv, $st) = explode(".", number_format($number, 2, ".", "")); | |
$lv = (int)$lv; | |
if ($lv >= 2000000000) { | |
return "Твърде голямо число"; | |
} | |
$text = numberToText($lv); | |
$text .= $lv == 1 ? " лев" : " лева"; | |
if ($st <> 0) { | |
$text = preg_replace("/^един /", "", $text); | |
} | |
if ($st && $st != 0) { | |
$sttext = numberToText($st, true); | |
$text .= " и " . numberToText($st, true); | |
$text .= $st == 1 ? " стотинка" : " стотинки"; | |
} | |
return $text; | |
} | |
function numberToText($number, $stotinki = false) | |
{ | |
$_num0 = array( | |
0 => "нула", | |
1 => "един", | |
2 => "две", | |
3 => "три", | |
4 => "четири", | |
5 => "пет", | |
6 => "шест", | |
7 => "седем", | |
8 => "осем", | |
9 => "девет", | |
10 => "десет", | |
11 => "единадесет", | |
12 => "дванадесет" | |
); | |
$_num100 = array(1 => "сто", 2 => "двеста", 3 => "триста"); | |
$number = (int)$number; | |
$_div10 = ($number - $number % 10) / 10; | |
$_mod10 = $number % 10; | |
$_div100 = ($number - $number % 100) / 100; | |
$_mod100 = $number % 100; | |
$_div1000 = ($number - $number % 1000) / 1000; | |
$_mod1000 = $number % 1000; | |
$_div1000000 = ($number - $number % 1000000) / 1000000; | |
$_mod1000000 = $number % 1000000; | |
$_div1000000000 = ($number - $number % 1000000000) / 1000000000; | |
$_mod1000000000 = $number % 1000000000; | |
if ($number == 0) { | |
return $_num0[$number]; | |
} | |
/* До двайсет */ | |
if ($number > 0 && $number < 20) { | |
if ($stotinki && $number == 1) { | |
return "една"; | |
} | |
if ($stotinki && $number == 2) { | |
return "две"; | |
} | |
if ($number == 2) { | |
return "два"; | |
} | |
return isset($_num0[$number]) ? $_num0[$number] : $_num0[$_mod10] . "надесет"; | |
} | |
/* До сто */ | |
if ($number > 19 && $number < 100) { | |
$tmp = ($_div10 == 2) ? "двадесет" : $_num0[$_div10] . "десет"; | |
$tmp = $_mod10 ? $tmp . " и " . numberToText($_mod10, $stotinki) : $tmp; | |
return $tmp; | |
} | |
/* До хиляда */ | |
if ($number > 99 && $number < 1000) { | |
$tmp = isset($_num100[$_div100]) ? $_num100[$_div100] : $_num0[$_div100] . "стотин"; | |
if (($_mod100 % 10 == 0 || $_mod100 < 20) && $_mod100 != 0) { | |
$tmp .= " и"; | |
} | |
if ($_mod100) { | |
$tmp .= " " . numberToText($_mod100); | |
} | |
return $tmp; | |
} | |
/* До милион */ | |
if ($number > 999 && $number < 1000000) { | |
/* Damn bulgarian @#$%@#$% два хиляди is wrong :) */ | |
$tmp = ($_div1000 == 1) ? "хиляда" : | |
(($_div1000 == 2) ? "две хиляди" : numberToText($_div1000) . " хиляди"); | |
$_num0[2] = "два"; | |
if (($_mod1000 % 10 == 0 || $_mod1000 < 20) && $_mod1000 != 0) { | |
if (!(($_mod100 % 10 == 0 || $_mod100 < 20) && $_mod100 != 0)) { | |
$tmp .= " и"; | |
} | |
} | |
if (($_mod1000 % 10 == 0 || $_mod1000 < 20) && $_mod1000 != 0 && $_mod1000 < 100) { | |
$tmp .= " и"; | |
} | |
if ($_mod1000) { | |
$tmp .= " " . numberToText($_mod1000); | |
} | |
return $tmp; | |
} | |
/* Над милион */ | |
if ($number > 999999 && $number < 1000000000) { | |
$tmp = ($_div1000000 == 1) ? "един милион" : numberToText($_div1000000) . " милиона"; | |
if (($_mod1000000 % 10 == 0 || $_mod1000000 < 20) && $_mod1000000 != 0) { | |
if (!(($_mod1000 % 10 == 0 || $_mod1000 < 20) && $_mod1000 != 0)) { | |
if (!(($_mod100 % 10 == 0 || $_mod100 < 20) && $_mod100 != 0)) { | |
$tmp .= " и"; | |
} | |
} | |
} | |
$and = ", "; | |
if (($_mod1000000 % 10 == 0 || $_mod1000000 < 20) && $_mod1000000 != 0 && $_mod1000000 < 1000) { | |
if (($_mod1000 % 10 == 0 || $_mod1000 < 20) && $_mod1000 != 0 && $_mod1000 < 100) { | |
$tmp .= " и"; | |
} | |
} | |
if ($_mod1000000) { | |
$tmp .= " " . numberToText($_mod1000000); | |
} | |
return $tmp; | |
} | |
/* Над милиард */ | |
if ($number > 99999999 && $number <= 2000000000) { | |
$tmp = ($_div1000000000 == 1) ? "един милиард" : ""; | |
$tmp = ($_div1000000000 == 2) ? "два милиарда" : $tmp; | |
if ($_mod1000000000) { | |
$tmp .= " " . numberToText($_mod1000000000); | |
} | |
return $tmp; | |
} | |
/* Bye ... */ | |
return ""; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment