За последние 24 часа нас посетили 22236 программистов и 1061 робот. Сейчас ищут 608 программистов ...

Число прописью

Тема в разделе "Решения, алгоритмы", создана пользователем Anonymous, 9 сен 2008.

  1. Anonymous

    Anonymous Guest

    Написал:

    PHP:
    1.  
    2. <?php
    3. class Plural {
    4.  
    5.     const MALE = 1;
    6.     const FEMALE = 2;
    7.     const NEUTRAL = 3;
    8.    
    9.     protected static $_digits = array(
    10.         self::MALE => array('ноль', 'один', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'),
    11.         self::FEMALE => array('ноль', 'одна', 'две', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'),
    12.         self::NEUTRAL => array('ноль', 'одно', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять')
    13.         );
    14.    
    15.     protected static $_ths = array(
    16.         0 => array('','',''),
    17.         1=> array('тысяча', 'тысячи', 'тысяч'),   
    18.         2 => array('миллион', 'миллиона', 'миллионов'),
    19.         3 => array('миллиард','миллиарда','миллиардов'),
    20.         4 => array('триллион','триллиона','триллионов'),
    21.         5 => array('квадриллион','квадриллиона','квадриллионов')
    22.         );
    23.    
    24.     protected static $_ths_g = array(self::NEUTRAL, self::FEMALE, self::MALE, self::MALE, self::MALE, self::MALE); // hack 4 thsds
    25.    
    26.     protected static $_teens = array(
    27.         0=>'десять',
    28.         1=>'одиннадцать',
    29.         2=>'двенадцать',
    30.         3=>'тринадцать',
    31.         4=>'четырнадцать',
    32.         5=>'пятнадцать',
    33.         6=>'шестнадцать',
    34.         7=>'семнадцать',
    35.         8=>'восемнадцать',
    36.         9=>'девятнадцать'
    37.         );
    38.  
    39.     protected static $_tens = array(
    40.         2=>'двадцать',
    41.         3=>'тридцать',
    42.         4=>'сорок',
    43.         5=>'пятьдесят',
    44.         6=>'шестьдесят',
    45.         7=>'семьдесят',
    46.         8=>'восемьдесят',
    47.         9=>'девяносто'
    48.         );
    49.    
    50.     protected static $_hundreds = array(
    51.         1=>'сто',
    52.         2=>'двести',
    53.         3=>'триста',
    54.         4=>'четыреста',
    55.         5=>'пятьсот',
    56.         6=>'шестьсот',
    57.         7=>'семьсот',
    58.         8=>'восемьсот',
    59.         9=>'девятьсот'
    60.         );
    61.    
    62.     protected function _ending($value, array $endings = array()) {
    63.         $result = '';
    64.         if ($value < 2) $result = $endings[0];
    65.         elseif ($value < 5) $result = $endings[1];
    66.         else $result = $endings[2];
    67.        
    68.         return $result;
    69.     }
    70.    
    71.     protected function _triade($value, $mode = self::MALE, array $endings = array()) {
    72.         $result = '';
    73.         if ($value == 0) { return $result; }
    74.         $triade = str_split(str_pad($value,3,'0',STR_PAD_LEFT));
    75.         if ($triade[0]!=0) { $result.= (self::$_hundreds[$triade[0]].' '); }
    76.         if ($triade[1]==1) { $result.= (self::$_teens[$triade[2]].' '); }
    77.         elseif(($triade[1]!=0)) { $result.= (self::$_tens[$triade[1]].' '); }
    78.         if (($triade[2]!=0)&&($triade[1]!=1)) { $result.= (self::$_digits[$mode][$triade[2]].' '); }
    79.         if ($value!=0) { $ends = ($triade[1]==1?'1':'').$triade[2]; $result.= self::_ending($ends,$endings).' '; }
    80.         return $result;
    81.     }
    82.    
    83.     public function asString($value, $mode = self::MALE, array $endings = array()) {
    84.         if (empty($endings)) { $endings = array('','',''); }
    85.         $result = '';
    86.         $steps = ceil(strlen($value)/3);
    87.         $sv = str_pad($value, $steps*3, '0', STR_PAD_LEFT);
    88.         for ($i=0; $i<$steps; $i++) {
    89.             $triade = substr($sv, $i*3, 3);
    90.             $iter = $steps - $i;
    91.             $ends = ($iter!=1)?(self::$_ths[$iter-1]):($endings);
    92.             $gender = ($iter!=1)?(self::$_ths_g[$iter-1]):($mode);
    93.             $result.= self::_triade($triade,$gender, $ends);
    94.         }
    95.         return $result;
    96.     }
    97.    
    98. }
    99. ?>
    100.  
    пример использования:

    PHP:
    1.  
    2. <?php
    3. include('plural.class.php');
    4. echo plural::asString(12232351004,plural::FEMALE,array('девушка','девушки','девушек'));
    5. ?>
    6.  
     
  2. Anonymous

    Anonymous Guest

    ЗЫ. Буду рад багтестерам. У кого плохо копируется, берите тут : http://codepaste.ru/1150/
     
  3. Anonymous

    Anonymous Guest

    Код написан ащще с нуля. :)
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    как плотно код пишешь =)
    без очков не разберёшь....
     
  5. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    Горбунов Олег
    $str_money = plural::asString(30,plural::MALE,array('рубль','рубля','рублей'));

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

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    вообщем когда десятки он их считает как единственное число, тоже самое когда сотни
    еще пару багов заметил:
    на тысячи не реагирует
    $str_money = plural::asString(4000,plural::MALE,array('рубль','рубля','рублей'));
    $str_money = plural::asString(4000,plural::FEMALE,array('рубль','рубля','рублей'));
    выводит просто число пропись: четыре тысячи.
     
  7. Anonymous

    Anonymous Guest

    хех. спаси, поправлю четь позже
     
  8. Kocapb

    Kocapb Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    169
    Симпатии:
    0
    не вопрос, попробую прогнать до миллиона посмотреть, так у тебя идея отличная, универсальная.
     
  9. Slammer

    Slammer Активный пользователь

    С нами с:
    19 окт 2008
    Сообщения:
    2
    Симпатии:
    0
    Я такие программы писал на пяти языках, начиная с Бейсика :) Так что спасибо, что на ПХП не придется.
    Из опыта - посмотри, как выводится что-нибудь типа 10005 руб.
     
  10. alxwm

    alxwm Guest

    Незнаю как вы но я использую свою штучку

    PHP:
    1.  
    2. <?php
    3. function numToRead($num, $word_one, $word_mult, $word_med = '') {
    4.     $num = intval($num);
    5.     if (!$word_med) $word_med = $word_mult;
    6.     if ($num===1) $ret = $word_one;
    7.     elseif ($num===0) $ret = $word_mult;
    8.     elseif (in_array(substr($num,-2),array(11,12,13,14))) $ret = $word_mult;
    9.     elseif ($GLOBALS['lang']=='ru' && substr($num,-1)==1) $ret = $word_one;
    10.     elseif (substr($num,-1)>=2 && substr($num,-1)<=4) $ret = $word_med;
    11.     else $ret = $word_mult;
    12.     return $ret;
    13. }
    14. ?>
    15.  
     
  11. MasterWebs

    MasterWebs Активный пользователь

    С нами с:
    9 ноя 2009
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Russia
    Вот ещё один пример подобного переводчика:
    http://eng5.ru/translator/numbers/ (мой собственный) 8)

    Переводит числа как на русский так и на английский язык:
    1) для русского языка несколько вариантов в зависимости от м/ж/ср рода
    2) для английского языка - британский и американский вариант.
    3) отрицание, дробная часть...

    ! всем желающим могу дать доступ к страничке имеющей входной параметр (число для перевода) и которую было бы удобно парсить с другого сайта.
     
  12. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    MasterWebs
    аватарку на фото меняем или удаляем
     
  13. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Напомним, что у американцев one может меняться (и почти всегда так и происходит) на классифицирующий артикль "а":
    a hundred twenty-three
     
  14. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    традиционно считается, что 1.40 это не одна целая сорок сотых, а один и четыре десятых
     
  15. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Хотя в математике можно отбросить конечные нули, поскольку они ничего не значат, иногда они пишутся для того, чтобы показать точность взятого иррационального (да даже рационального) числа.
    Но что мы получаем, когда это вводим?
    А вот что:
    Кроме того, откуда род тут мужской?
    Десятичная дробь женского рода, одна целая тоже женского рода
    Что за нах?
     
  16. kostyl

    kostyl Guest

    так и надо выводить =))
    У меня для каждого языка свой метеод, ибо на русском одно, на польском другое и т.д.
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Чето я не догоняю, а как поравильно?
     
  18. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    У количественных числительных ВООБЩЕ НЕТ рода в русском языке.
    А тут, даже если смотреть на это с самой снисходительной точки зрения, почему-то мужской род.
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Apple
    Не. Я не догоняю, как в таком случае правильно прописью написать число 1.20000.
     
  20. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я тоже не догоняю ибо никогда не приходилось ни писать прописью это, ни говорить)
    Обычно дальше десятитысячных мне просто не нужно.
    А прикопался я к роду, которого у количественных числительных быть не может, а там почему-то мужской вообще вписан О.о
     
  21. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это твои личные проблемы.

    двадцать стотысячных - правильно.
    равно как и
    двадцать одна стотысячная.
     
  22. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это ПОРЯДКОВЫЕ числительные, умник.
    Читать умеешь?
    Тогда читай внимательно ещё раз:
    Разницу чуешь, или даже этого не способен заметить?

    У меня, в отличии от тебя, с русским языком проблем нет.
    Можешь не доказывать это в очередной раз, проявляя свою излишнюю умность в вопросах, в которых ты абсолютно некомпетентен
     
  23. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Точно?

    Мсье хотя бы не подставлялся так тупо.
    Поэтому, дочка...
    Когда "догонишь" - будешь нам "втирать".
    А пока - слушай, что тебе говорят умные дяди.
     
  24. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я всегда слушаю, что мне говорят умные дяди, но ты явно не в их числе.
     
  25. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    На остальное возразить, видимо, нечего :)

    Лузер :)