Написал: PHP: <?php class Plural { const MALE = 1; const FEMALE = 2; const NEUTRAL = 3; protected static $_digits = array( self::MALE => array('ноль', 'один', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'), self::FEMALE => array('ноль', 'одна', 'две', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять'), self::NEUTRAL => array('ноль', 'одно', 'два', 'три', 'четыре','пять', 'шесть', 'семь', 'восемь', 'девять') ); protected static $_ths = array( 0 => array('','',''), 1=> array('тысяча', 'тысячи', 'тысяч'), 2 => array('миллион', 'миллиона', 'миллионов'), 3 => array('миллиард','миллиарда','миллиардов'), 4 => array('триллион','триллиона','триллионов'), 5 => array('квадриллион','квадриллиона','квадриллионов') ); protected static $_ths_g = array(self::NEUTRAL, self::FEMALE, self::MALE, self::MALE, self::MALE, self::MALE); // hack 4 thsds protected static $_teens = array( 0=>'десять', 1=>'одиннадцать', 2=>'двенадцать', 3=>'тринадцать', 4=>'четырнадцать', 5=>'пятнадцать', 6=>'шестнадцать', 7=>'семнадцать', 8=>'восемнадцать', 9=>'девятнадцать' ); protected static $_tens = array( 2=>'двадцать', 3=>'тридцать', 4=>'сорок', 5=>'пятьдесят', 6=>'шестьдесят', 7=>'семьдесят', 8=>'восемьдесят', 9=>'девяносто' ); protected static $_hundreds = array( 1=>'сто', 2=>'двести', 3=>'триста', 4=>'четыреста', 5=>'пятьсот', 6=>'шестьсот', 7=>'семьсот', 8=>'восемьсот', 9=>'девятьсот' ); protected function _ending($value, array $endings = array()) { $result = ''; if ($value < 2) $result = $endings[0]; elseif ($value < 5) $result = $endings[1]; else $result = $endings[2]; return $result; } protected function _triade($value, $mode = self::MALE, array $endings = array()) { $result = ''; if ($value == 0) { return $result; } $triade = str_split(str_pad($value,3,'0',STR_PAD_LEFT)); if ($triade[0]!=0) { $result.= (self::$_hundreds[$triade[0]].' '); } if ($triade[1]==1) { $result.= (self::$_teens[$triade[2]].' '); } elseif(($triade[1]!=0)) { $result.= (self::$_tens[$triade[1]].' '); } if (($triade[2]!=0)&&($triade[1]!=1)) { $result.= (self::$_digits[$mode][$triade[2]].' '); } if ($value!=0) { $ends = ($triade[1]==1?'1':'').$triade[2]; $result.= self::_ending($ends,$endings).' '; } return $result; } public function asString($value, $mode = self::MALE, array $endings = array()) { if (empty($endings)) { $endings = array('','',''); } $result = ''; $steps = ceil(strlen($value)/3); $sv = str_pad($value, $steps*3, '0', STR_PAD_LEFT); for ($i=0; $i<$steps; $i++) { $triade = substr($sv, $i*3, 3); $iter = $steps - $i; $ends = ($iter!=1)?(self::$_ths[$iter-1]):($endings); $gender = ($iter!=1)?(self::$_ths_g[$iter-1]):($mode); $result.= self::_triade($triade,$gender, $ends); } return $result; } } ?> пример использования: PHP: <?php include('plural.class.php'); echo plural::asString(12232351004,plural::FEMALE,array('девушка','девушки','девушек')); ?>
Горбунов Олег $str_money = plural::asString(30,plural::MALE,array('рубль','рубля','рублей')); выводит тридцать рубль прогоню тест до 100 посмотрю, черкону результаты
вообщем когда десятки он их считает как единственное число, тоже самое когда сотни еще пару багов заметил: на тысячи не реагирует $str_money = plural::asString(4000,plural::MALE,array('рубль','рубля','рублей')); $str_money = plural::asString(4000,plural::FEMALE,array('рубль','рубля','рублей')); выводит просто число пропись: четыре тысячи.
Я такие программы писал на пяти языках, начиная с Бейсика Так что спасибо, что на ПХП не придется. Из опыта - посмотри, как выводится что-нибудь типа 10005 руб.
Незнаю как вы но я использую свою штучку PHP: <?php function numToRead($num, $word_one, $word_mult, $word_med = '') { $num = intval($num); if (!$word_med) $word_med = $word_mult; if ($num===1) $ret = $word_one; elseif ($num===0) $ret = $word_mult; elseif (in_array(substr($num,-2),array(11,12,13,14))) $ret = $word_mult; elseif ($GLOBALS['lang']=='ru' && substr($num,-1)==1) $ret = $word_one; elseif (substr($num,-1)>=2 && substr($num,-1)<=4) $ret = $word_med; else $ret = $word_mult; return $ret; } ?>
Вот ещё один пример подобного переводчика: http://eng5.ru/translator/numbers/ (мой собственный) 8) Переводит числа как на русский так и на английский язык: 1) для русского языка несколько вариантов в зависимости от м/ж/ср рода 2) для английского языка - британский и американский вариант. 3) отрицание, дробная часть... ! всем желающим могу дать доступ к страничке имеющей входной параметр (число для перевода) и которую было бы удобно парсить с другого сайта.
Напомним, что у американцев one может меняться (и почти всегда так и происходит) на классифицирующий артикль "а": a hundred twenty-three
Хотя в математике можно отбросить конечные нули, поскольку они ничего не значат, иногда они пишутся для того, чтобы показать точность взятого иррационального (да даже рационального) числа. Но что мы получаем, когда это вводим? А вот что: Кроме того, откуда род тут мужской? Десятичная дробь женского рода, одна целая тоже женского рода Что за нах?
так и надо выводить =)) У меня для каждого языка свой метеод, ибо на русском одно, на польском другое и т.д.
У количественных числительных ВООБЩЕ НЕТ рода в русском языке. А тут, даже если смотреть на это с самой снисходительной точки зрения, почему-то мужской род.
Я тоже не догоняю ибо никогда не приходилось ни писать прописью это, ни говорить) Обычно дальше десятитысячных мне просто не нужно. А прикопался я к роду, которого у количественных числительных быть не может, а там почему-то мужской вообще вписан О.о
Это ПОРЯДКОВЫЕ числительные, умник. Читать умеешь? Тогда читай внимательно ещё раз: Разницу чуешь, или даже этого не способен заметить? У меня, в отличии от тебя, с русским языком проблем нет. Можешь не доказывать это в очередной раз, проявляя свою излишнюю умность в вопросах, в которых ты абсолютно некомпетентен
Точно? Мсье хотя бы не подставлялся так тупо. Поэтому, дочка... Когда "догонишь" - будешь нам "втирать". А пока - слушай, что тебе говорят умные дяди.