示例#1
0
 /**
  *	Получить денежныую сумму прописью в указаном формате.
  *
  * @param string	$format		Шаблон где:
  *					`%n` - сумма с в формате "1 000 000,00"
  *					`%N` - сумма с в формате "1 000 000,01", если после запятой == 0, то выводится целая только часть "1 000 000"
  *					`%o` - часть суммы до запятой числом;
  *					`%i` - часть суммы до запятой прописью с маленькой буквы;
  *					`%I` - часть суммы до запятой прописью с большой буквы;
  *					`%f` - часть суммы после запятой числом;
  *					`%F` - часть суммы после запятой числом, если == 0, то не выводить;
  *					`%d` - часть суммы после запятой прописью с маленькой буквы;
  *					`%D` - часть суммы после запятой прописью с большой буквы;
  *					`%c` - валюта типа руб., долл. с маленькой буквы
  *					`%C` - валюта типа руб., долл. с большой буквы
  *					`%s` - валюта типа коп., цент. с маленькой буквы
  *					`%S` - валюта типа коп., цент. с большой буквы
  *					`%e` - страна - костыль, для России нихуя, для штатов суффикс США
  *					Например "( %i ) %с" -> "( сто двадцать три ) рубля";
  * @param int	$sum		Сумма в виде числа
  * @param mixed	$currency	Индекс валюты:
  *					1 - RUR;
  *					2 - USD;
  * @param string	$delimiter	Разделитель для конечного варианта
  * @param int	$case		Падеж: 1 - именительный, 2 - родительный, 3 - дательный, 4 - винительный, 5 - творительный, 6 - предложный
  * @return	Преобразованную строку если число соответствует стандарту, либо исходную строку.
  */
 public static function moneytostrf($format, $sum, $currency = 1, $delimiter = '.', $case = 1)
 {
     // NOTE: Требуется привести к стандарту (123456.89):
     //	не должно садержать пробелы
     //	дробная часть после точки `.`
     //	два знака в дробной части
     if ($delimiter == '.') {
         $sum = number_format(text::float($sum, array('single_dot_as_decimal' => TRUE)), 2, '.', '');
     } else {
         $sum = number_format(text::float($sum), 2, '.', '');
     }
     if (preg_match('/(\\d+)(?:[' . $delimiter . ']{1}(\\d+))?/', $sum, $matches)) {
         $_i = '';
         $_I = '';
         $_d = '';
         $_D = '';
         $_c = '';
         $_C = '';
         $_s = '';
         $_S = '';
         $_o = intval($matches[1]);
         $aX = self::$LIBTEXT_GLOBALS['currency'][$currency];
         $_f = sprintf("%02d", !empty($matches[2]) ? intval(substr($matches[2], 0, 2)) : 0);
         $_F = $_f > 0 ? $_f : '';
         $_n = number_format($sum, 2, ',', ' ');
         $_N = $_f > 0 ? $_n : number_format(intval($sum), 0, 0, ' ');
         $aY = self::$LIBTEXT_GLOBALS['currency2'][$currency];
         $x = text::numtostr($_o, 1, $case, 1, 1, $aX);
         if (!empty($aX)) {
             $x = explode(' ', $x);
             $_c = array_pop($x);
             $_C = ucfirst($_c);
             $_i = join(' ', $x);
         } else {
             $_i = $x;
         }
         $_I = ucfirst($_i);
         $y = text::numtostr($_f, 1, $case, 2, 1, $aY);
         if (!empty($aY)) {
             if ($y) {
                 $y = explode(' ', $y);
                 $_s = array_pop($y);
                 $_S = ucfirst($_s);
                 $_d = join(' ', $y);
                 $_D = ucfirst($_d);
                 $_p = $dec . '/100';
             } else {
                 if ($_f == '00') {
                     $_s = $aY['2']['2'];
                     $_S = ucfirst($_s);
                 }
             }
         } else {
             $_d = $y;
         }
         $_D = ucfirst($_d);
         $_p = $dec . '/100';
         if ($_c) {
             $_e = self::$LIBTEXT_GLOBALS['ccy_postfix'][$currency];
         }
         $replace_what = array('%n', '%N', '%o', '%i', '%I', '%f', '%F', '%d', '%D', '%p', '%c', '%C', '%s', '%S', '%e');
         $replace_with = array($_n, $_N, $_o, $_i, $_I, $_f, $_F, $_d, $_D, $_p, $_c, $_C, $_s, $_S, $_e);
         return trim(str_replace($replace_what, $replace_with, $format));
     } else {
         return $sum;
     }
 }