Skip to content

Instantly share code, notes, and snippets.

@AlekVolsk
Created February 10, 2019 09:14
Show Gist options
  • Save AlekVolsk/db83c63e7dacf567bd8715360c2e8b87 to your computer and use it in GitHub Desktop.
Save AlekVolsk/db83c63e7dacf567bd8715360c2e8b87 to your computer and use it in GitHub Desktop.
Сумма прописью
<?php
function numStr($num)
{
$m = [
['ноль'],
['-','один','два','три','четыре','пять','шесть','семь','восемь','девять'],
['десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'],
['-','-','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'],
['-','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'],
['-','одна','две']
];
$r = [
['...ллион','','а','ов'],
['тысяч','а','и',''],
['миллион','','а','ов'],
['миллиард','','а','ов'],
['триллион','','а','ов'],
['квадриллион','','а','ов'],
['квинтиллион','','а','ов']
];
if ($num == 0)
return $m[0][0];
$o=[];
foreach(array_reverse(str_split(str_pad($num,ceil(strlen($num)/3)*3,'0',STR_PAD_LEFT),3))as$k=>$p)
{
$o[$k]=[];
foreach ($n = str_split($p) as $kk => $pp)
if (!$pp)
continue;
else
switch ($kk)
{
case 0:
$o[$k][] = $m[4][$pp];
break;
case 1:
if ($pp == 1)
{
$o[$k][] = $m[2][$n[2]];
break 2;
}
else
{
$o[$k][] = $m[3][$pp];
break;
}
case 2:
if (($k == 1) && ($pp <= 2))
{
$o[$k][] = $m[5][$pp];
}
else
{
$o[$k][] = $m[1][$pp];
}
break;
}
$p *= 1;
if (!$r[$k])
$r[$k] = reset($r);
if ($p && $k)
switch (true)
{
case preg_match("/^[1]$|^\\d*[0,2-9][1]$/", $p):
$o[$k][] = $r[$k][0] . $r[$k][1];
break;
case preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/", $p):
$o[$k][] = $r[$k][0] . $r[$k][2];
break;
default:
$o[$k][] = $r[$k][0] . $r[$k][3];
break;
}
$o[$k] = implode(' ', $o[$k]);
}
return implode(' ', array_reverse($o));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment