Frameworks.suFrameworks.su Шпаргалка вебмастера

  • Главная
  • Framework Kohana
  • PHP
  • Javascript
  • CSS
  • Сервисы
    • Генератор паролей
  • Контакты
Главная / PHP / PHP — сумма прописью

PHP — сумма прописью

06.07.2014 1 10392

Иногда при составлении накладных, счет фактур или других платежных документов необходимо указать сумму прописью. Для этих задач есть решение. Скрипт может переводить числа в сумму прописью, также можно настроить для других языков или валют.

Ниже представлен код скрипта генерирующего сумму прописью:

/**
* Возвращает сумму прописью
*/
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)] ];
}

Пример использования:

num2str('12345678.93'); // двенадцать миллионов триста сорок пять тысяч шестьсот семьдесят восемь рублей 93 копейки

В следующей статье мы создадим функцию для преобразования числа в сумму прописью на Javascript.

Скачать рабочий пример

Теги:
  • Пример
  • Скрипт

Комментарии

  1. MeniskPl
    MeniskPl
    07.10.2014 11:14

    Вoобщe я с вaми полностью cоглаcен. 3десь eсть над чeм подумать и пoгoвopить. В общeм-тo мне пoнравилось,буду заходить сюда eще,можeт, что-то новeнькoе увижу у вaс.

    Ответить

Оставить комментарий Отмена

*

*

*

*

Категории

  • PHP
    • Framework Kohana
  • Javascript
  • CSS
  • Администрирование

Теги

Framework Kohana Пример jQuery Уроки CRON Установка и настройка Backup CSS3 Валидация API Bash Cache Captcha i18n Linux

Авторизация

  • Забыли пароль?
  • Регистрация

Популярные статьи

  • Находим расстояние до ближайших станций метро

    Находим расстояние до ближайших станций метро

    17.02.2017 102981
  • Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

    Регистрация и авторизация пользователей. Модуль Auth в Kohana 3.3.x

    02.07.2014 44645
  • Собственная система лайков на PHP и JQuery

    Собственная система лайков на PHP и JQuery

    06.04.2015 33241
  • Javascript — сумма прописью

    Javascript — сумма прописью

    07.07.2014 23090
  • Cross-domain ajax с помощью jQuery

    Cross-domain ajax с помощью jQuery

    24.04.2015 19964
Copyright © 2014-2025 Frameworks.su. Все права защищены.