Php функция для вывода суммы текстом на русском

12.06.2018

Пример кода, который возвращает сумму на кириллице.

price_text.php (Download)

 <?php
  class soPriceText
  {
    /**
    * Возвращает сумму прописью
    */
    public 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("%015.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[]= $this->_morph($v,$uName);
          }
        } 
      }
      else
      {
        $out[] = $translite['null']; 
      }
  
      // Дописываем название "рубли"
      $out[] = $this->_morph(intval($rub),$translite['ur']); // rub
      // Дописываем название "копейка"
      $out[] = $kop.' '.$this->_morph($kop,$translite['uc']); // kop
  
      // Объединяем маcсив в строку
      $str = join(' ',$out); 
  
      // Удаляем лишние пробелы и возвращаем результат
      return trim(preg_replace('/ {2,}/', ' ', $str)); 
    }

    /**
     * Склоняем словоформу
     */
    private function _morph($number, $titles)
    {
      $cases = array (2, 0, 1, 1, 1, 2);
      return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
    }
  }
  
  $oPriceText = new soPriceText();
  echo $oPriceText->num2str(29650);


Категории: PHP
Пометки: php сумма прописью на русском
Яндекс.Метрика