Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Слова виде чисел

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
pantela
Отправлено: 10 Августа, 2013 - 02:13:02
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Есть таблица с числами напр.
150
75
137
...

Задача стоит что бы эти числа были виде слов. напр.
- Сто пятьдесят
- Семьдесят Пять
- Сто Тридцать Семь
...

т.е. если быть точнее, бугалтерю надо выписывать чек, и требовательно что бы и словами была сумма написанно.

Как научиь PHP этому? Составлять массив всех чисел и так подставлять что-ли Однако Это же может быть до 10000 значении в массиве. умаю есть готовое решение.
+
Мне надо не на русском яз. что бы было бы, но думаю потом перепишу есть есть готовое решение на русс.

спс.Ув.

P.S. Нашёл это http://www[dot]internet-technologies[dot][dot][dot]/article_17[dot]html , на сколько правильное решение?

(Отредактировано автором: 10 Августа, 2013 - 02:13:43)

 
 Top
DlTA
Отправлено: 10 Августа, 2013 - 02:55:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




pantela пишет:
на сколько правильное решение?
там в коментах все написано, читайте
 
 Top
pantela
Отправлено: 16 Мая, 2014 - 17:21:26
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 765
Дата рег-ции: Авг. 2010  


Помог: 1 раз(а)




Вот начал разберать класс, вроде раборает, но десятичные, сотые... числа не переводить

Ввожу 50.50

Выводит:
Пятьдесят рублей 50 копеек
Пятьдесят метров 50 сантиметров

+ не работает с UTF-8 выводить в начале слов ��, как я понял это функци не поддрежывает UTF-8

Как дописать?

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class NumToText
  4. {
  5.    var $Mant = array(); // описания мантисс
  6.    // к примеру ('рубль', 'рубля', 'рублей')
  7.    // или ('метр', 'метра', 'метров')
  8.    var $Expon = array(); // описания экспонент
  9.    // к примеру ('копейка', 'копейки', 'копеек')
  10.  
  11.    function NumToText()
  12.    {
  13.    }
  14.  
  15.    // установка описания мантисс
  16.    function SetMant($mant)
  17.    {
  18.       $this->Mant = $mant;
  19.    }
  20.  
  21.    // установка описания экспонент
  22.    function SetExpon($expon)
  23.    {
  24.       $this->Expon = $expon;
  25.    }
  26.  
  27.    // функция возвращает необходимый индекс описаний разряда
  28.    // ('миллион', 'миллиона', 'миллионов') для числа $ins
  29.    // например для 29 вернется 2 (миллионов)
  30.    // $ins максимум два числа
  31.    function DescrIdx($ins)
  32.    {
  33.       if(intval($ins/10) == 1) // числа 10 - 19: 10 миллионов, 17 миллионов
  34.       return 2;
  35.       else
  36.       {
  37.          // для остальных десятков возьмем единицу
  38.          $tmp = $ins%10;
  39.          if($tmp == 1) // 1: 21 миллион, 1 миллион
  40.          return 0;
  41.          else if($tmp >= 2 && $tmp <= 4)
  42.          return 1; // 2-4: 62 миллиона
  43.          else
  44.          return 2; // 5-9 48 миллионов
  45.       }
  46.    }
  47.  
  48.    // IN: $in - число,
  49.    // $raz - разряд числа - 1, 1000, 1000000 и т.д.
  50.    // внутри функции число $in меняется
  51.    // $ar_descr - массив описаний разряда ('миллион', 'миллиона', 'миллионов') и т.д.
  52.    // $fem - признак женского рода разряда числа (true для тысячи)
  53.    function DescrSot(&$in, $raz, $ar_descr, $fem = false)
  54.    {
  55.       $ret = '';
  56.  
  57.       $conv = intval($in / $raz);
  58.       $in %= $raz;
  59.  
  60.       $descr = $ar_descr[ $this->DescrIdx($conv%100) ];
  61.  
  62.       if($conv >= 100)
  63.       {
  64.          $Sot = array('сто', 'двести', 'триста', 'четыреста', 'пятьсот',
  65.          'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
  66.          $ret = $Sot[intval($conv/100) - 1] . ' ';
  67.          $conv %= 100;
  68.       }
  69.  
  70.       if($conv >= 10)
  71.       {
  72.          $i = intval($conv / 10);
  73.          if($i == 1)
  74.          {
  75.             $DesEd = array('десять', 'одиннадцать', 'двенадцать', 'тринадцать',
  76.             'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать',
  77.             'восемнадцать', 'девятнадцать' );
  78.             $ret .= $DesEd[ $conv - 10 ] . ' ';
  79.             $ret .= $descr;
  80.             // возвращаемся здесь
  81.             return $ret;
  82.          }
  83.          $Des = array('двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
  84.          'семьдесят', 'восемьдесят', 'девяносто' );
  85.          $ret .= $Des[$i - 2] . ' ';
  86.       }
  87.  
  88.       $i = $conv % 10;
  89.       if($i > 0)
  90.       {
  91.          if( $fem && ($i==1 || $i==2) )
  92.          {
  93.             // для женского рода (сто одна тысяча)
  94.             $Ed = array('одна', 'две');
  95.             $ret .= $Ed[$i - 1] . ' ';
  96.          }
  97.          else
  98.          {
  99.             $Ed = array('один', 'два', 'три', 'четыре', 'пять',
  100.             'шесть', 'семь', 'восемь', 'девять' );
  101.             $ret .= $Ed[$i - 1] . ' ';
  102.          }
  103.       }
  104.       $ret .= $descr;
  105.       return $ret;
  106.    }
  107.  
  108.    // IN: $sum - число, например 1256.18
  109.    function Convert($sum)
  110.    {
  111.       $ret = '';
  112.  
  113.       // имена данных перменных остались от предыдущей версии
  114.       // когда скрипт конвертировал только денежные суммы
  115.       $Kop = 0;
  116.       $Rub = 0;
  117.  
  118.       $sum = trim($sum);
  119.       // удалим пробелы внутри числа
  120.       $sum = str_replace(' ', '', $sum);
  121.  
  122.       // флаг отрицательного числа
  123.       $sign = false;
  124.       if($sum[0] == '-')
  125.       {
  126.          $sum = substr($sum, 1);
  127.          $sign = true;
  128.       }
  129.  
  130.       // заменим запятую на точку, если она есть
  131.       $sum = str_replace(',', '.', $sum);
  132.  
  133.       $Rub = intval($sum);
  134.       if (strpos($sum, '.')!==false){
  135.                 list(, $Kop) = explode('.', $sum, 2);
  136.                 if (strlen($Kop)>2) $Kop = substr($Kop, 0, 2);
  137.                 $Kop = intval($Kop);
  138.       }
  139.  
  140.       if($Rub)
  141.       {
  142.          // значение $Rub изменяется внутри функции DescrSot
  143.          // новое значение: $Rub %= 1000000000 для миллиарда
  144.          if($Rub >= 1000000000)
  145.          $ret .= $this->DescrSot($Rub, 1000000000,
  146.          array('миллиард', 'миллиарда', 'миллиардов')) . ' ';
  147.          if($Rub >= 1000000)
  148.          $ret .= $this->DescrSot($Rub, 1000000,
  149.          array('миллион', 'миллиона', 'миллионов') ) . ' ';
  150.          if($Rub >= 1000)
  151.          $ret .= $this->DescrSot($Rub, 1000,
  152.          array('тысяча', 'тысячи', 'тысяч'), true) . ' ';
  153.  
  154.          $ret .= $this->DescrSot($Rub, 1, $this->Mant) . ' ';
  155.  
  156.          // если необходимо поднимем регистр первой буквы
  157.          $ret[0] = chr( ord($ret[0]) + ord('A') - ord('a') );
  158.          // для корректно локализованных систем можно закрыть верхнюю строку
  159.          // и раскомментировать следующую (для легкости сопровождения)
  160.          // $ret[0] = strtoupper($ret[0]);
  161.       }
  162.       if($Kop < 10)
  163.       $ret .= '0';
  164.       $ret .= $Kop . ' ' . $this->Expon[ $this->DescrIdx($Kop) ];
  165.  
  166.       // если число было отрицательным добавим минус
  167.       if($sign)
  168.       $ret = '-' . $ret;
  169.       return $ret;
  170.    }
  171. }
  172.  
  173. class ManyToText extends NumToText
  174. {
  175.    function ManyToText()
  176.    {
  177.       $this->SetMant( array('рубль', 'рубля', 'рублей') );
  178.       $this->SetExpon( array('копейка', 'копейки', 'копеек') );
  179.    }
  180. }
  181.  
  182. class MetrToText extends NumToText
  183. {
  184.    function MetrToText()
  185.    {
  186.       $this->SetMant( array('метр', 'метра', 'метров') );
  187.       $this->SetExpon( array('сантиметр', 'сантиметра', 'сантиметров') );
  188.    }
  189. }
  190.  
  191. ?>
  192. <html>
  193. <head>
  194.         <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
  195. </head>
  196. <body>
  197. <center>
  198. </center>
  199.         <?PHP
  200.         if( isset($_GET['num']) )
  201.         {
  202.            $mt = new ManyToText();
  203.            $nt = new MetrToText();
  204.            echo $mt->Convert($_GET['num']) . '<BR />';
  205.            echo $nt->Convert($_GET['num']) . '<BR />';
  206.         }
  207.         ?>
  208.         <form action="" method="get">
  209.                 input number:           <input type="text" name="num">          <input type="submit" value=" get ">
  210.         </form>
  211. </body>
  212. </html>

(Отредактировано автором: 16 Мая, 2014 - 18:09:24)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB