Advertisement
krot

Получение суммы прописью

Jun 28th, 2017
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.50 KB | None | 0 0
  1. <? /**
  2.  * Возвращает сумму прописью
  3.  * @author runcore
  4.  * @uses morph(...)
  5.  */
  6. function num2str($num) {
  7.     $nul='ноль';
  8.     $ten=array(
  9.         array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
  10.         array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
  11.     );
  12.     $a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
  13.     $tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
  14.     $hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
  15.     $unit=array( // Units
  16.         array('копейка' ,'копейки' ,'копеек',    1),
  17.         array('рубль'   ,'рубля'   ,'рублей'    ,0),
  18.         array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
  19.         array('миллион' ,'миллиона','миллионов' ,0),
  20.         array('миллиард','милиарда','миллиардов',0),
  21.     );
  22.     //
  23.     list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
  24.     $out = array();
  25.     if (intval($rub)>0) {
  26.         foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
  27.             if (!intval($v)) continue;
  28.             $uk = sizeof($unit)-$uk-1; // unit key
  29.             $gender = $unit[$uk][3];
  30.             list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
  31.             // mega-logic
  32.             $out[] = $hundred[$i1]; # 1xx-9xx
  33.             if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
  34.             else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
  35.             // units without rub & kop
  36.             if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
  37.         } //foreach
  38.     }
  39.     else $out[] = $nul;
  40.     $out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
  41.     $out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
  42.     return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
  43. }
  44.  
  45. /**
  46.  * Склоняем словоформу
  47.  * @ author runcore
  48.  */
  49. function morph($n, $f1, $f2, $f5) {
  50.     $n = abs(intval($n)) % 100;
  51.     if ($n>10 && $n<20) return $f5;
  52.     $n = $n % 10;
  53.     if ($n>1 && $n<5) return $f2;
  54.     if ($n==1) return $f1;
  55.     return $f5;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement