Иногда при составлении накладных, счет фактур или других платежных документов необходимо указать сумму прописью. Для этих задач есть решение. Скрипт может переводить числа в сумму прописью, также можно настроить для других языков или валют.
Ниже представлен код скрипта генерирующего сумму прописью:
/** * Возвращает сумму прописью */ function num2str($num,$translite=null){ $defaultTranslite = array( 'null' => 'ноль', 'a1' => array(1=>'один',2=>'два',3=>'три',4=>'четыре',5=>'пять',6=>'шесть',7=>'семь',8=>'восемь',9=>'девять'), 'a2' => array(1=>'одна',2=>'две',3=>'три',4=>'четыре',5=>'пять',6=>'шесть',7=>'семь',8=>'восемь',9=>'девять'), 'a10' => array(0=>'десять',1=>'одиннадцать',2=>'двенадцать',3=>'тринадцать',4=>'четырнадцать',5=>'пятнадцать',6=>'шестнадцать',7=>'семнадцать',8=>'восемнадцать',9=>'девятнадцать'), 'a20' => array(2=>'двадцать',3=>'тридцать',4=>'сорок',5=>'пятьдесят',6=>'шестьдесят',7=>'семьдесят',8=>'восемьдесят',9=>'девяносто'), 'a100' => array(1=>'сто',2=>'двести',3=>'триста',4=>'четыреста',5=>'пятьсот',6=>'шестьсот',7=>'семьсот',8=>'восемьсот',9=>'девятьсот'), 'uc' => array('копейка', 'копейки', 'копеек'), 'ur' => array('рубль', 'рубля', 'рублей'), 'u3' => array('тысяча', 'тысячи', 'тысяч'), 'u2' => array('миллион', 'миллиона', 'миллионов'), 'u1' => array('миллиард', 'миллиарда', 'миллиардов'), ); $translite = is_null($translite) ? $defaultTranslite : $translite; list($rub,$kop) = explode('.',sprintf("5.2f", floatval($num))); $out = array(); if (intval($rub) > 0) { // Разбиваем число по три символа $cRub = str_split($rub,3); foreach($cRub as $uk=>$v) { if (!intval($v)) continue; list($i1,$i2,$i3) = array_map('intval',str_split($v,1)); $out[] = isset($translite['a100'][$i1]) ? $translite['a100'][$i1] : ''; // 1xx-9xx $ax = ($uk+1 == 3) ? 'a2' : 'a1'; if ($i2 > 1) $out[]= $translite['a20'][$i2].' '.$translite[$ax][$i3]; // 20-99 else $out[]= $i2 > 0 ? $translite['a10'][$i3] : $translite[$ax][$i3]; // 10-19 | 1-9 if (count($cRub) > $uk+1){ $uName = $translite['u'.($uk+1)]; $out[]= morph($v,$uName); } } } else $out[] = $translite['null']; // Дописываем название "рубли" $out[] = morph(intval($rub),$translite['ur']); // rub // Дописываем название "копейка" $out[] = $kop.' '.morph($kop,$translite['uc']); // kop // Объединяем маcсив в строку $str = join(' ',$out); // Удаляем лишние пробелы и возвращаем результат return trim(preg_replace('/ {2,}/', ' ', $str)); } /** * Склоняем словоформу */ function morph($number, $titles) { $cases = array (2, 0, 1, 1, 1, 2); return $titles[ ($number0>4 && $number0<20)? 2 : $cases[min($number, 5)] ]; }
Пример использования:
Вoобщe я с вaми полностью cоглаcен. 3десь eсть над чeм подумать и пoгoвopить. В общeм-тo мне пoнравилось,буду заходить сюда eще,можeт, что-то новeнькoе увижу у вaс.