Created
May 1, 2018 07:26
-
-
Save mes01/ae2f0b1eeebf7d371ae63efabad0cbce to your computer and use it in GitHub Desktop.
сумма прописью
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
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