Skip to content

Instantly share code, notes, and snippets.

@mes01
Created May 1, 2018 07:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mes01/ae2f0b1eeebf7d371ae63efabad0cbce to your computer and use it in GitHub Desktop.
Save mes01/ae2f0b1eeebf7d371ae63efabad0cbce to your computer and use it in GitHub Desktop.
сумма прописью
function num2word($num)
{
// $num - цело число
# Все варианты написания чисел прописью от 0 до 999 скомпануем в один небольшой массив
$m=array(
array('ноль'),
array('-','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
array('-','-','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
array('-','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
array('-','одна','две')
);
# Все варианты написания разрядов прописью скомпануем в один небольшой массив
$r=array(
array('...ллион','','а','ов'), // используется для всех неизвестно больших разрядов
array('тысяч','а','и',''),
array('миллион','','а','ов'),
array('миллиард','','а','ов'),
array('триллион','','а','ов'),
array('квадриллион','','а','ов'),
array('квинтиллион','','а','ов')
// ,array(... список можно продолжить
);
if($num==0)return$m[0][0]; # Если число ноль, сразу сообщить об этом и выйти
$o=array(); # Сюда записываем все получаемые результаты преобразования
# Разложим исходное число на несколько трехзначных чисел и каждое полученное такое число обработаем отдельно
foreach(array_reverse(str_split(str_pad($num,ceil(strlen($num)/3)*3,'0',STR_PAD_LEFT),3))as$k=>$p){
$o[$k]=array();
# Алгоритм, преобразующий трехзначное число в строку прописью
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