/** * Получить денежныую сумму прописью в указаном формате. * * @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; } }