Вывести дня или дней

mirabo

Новичок
Вывести дня или дней

Народ, подскажите, плиз, как сделать что бы автоматом выводилось в зависимости от числа слово "дня" или "дней" (например, 20 дней, а 3 дня)? Количество дней считается скриптом и выдается числом.
 

antonio

Moderator
Команда форума
ну во-первых - 1 день, 2 дня, 3 дня, 4 и далее дней.
Во-вторых, смотрим на последнюю цифру (остаток от деления на 10) и выводим нужное слово.
 

mirabo

Новичок
спасибо, видимо, гового нет... придется писать, при моих познаниях - это день займет ;)
 

antonio

Moderator
Команда форума
Блин, при твоих знаниях это займет 5 минут.

-~{}~ 28.12.09 08:57:

Может быть потратишь 30 минут на поиск оператора взятия остатка от деления.
 

Фанат

oncle terrible
Команда форума
mirabo, при таком уровне нельзя брать готового. Иначе привыкнешь, и тогда за твою жизнь никто не даст и ломаного цента.
Учись. День, потраченый сейчас, обернется стократной прибылью
 

damngood

Мозг был, но ушел...
Число переведено в строку, не есть хорошо, но да ладно.
Не хотел писать, но...

PHP:
        $num = '123150';

        if($num[strlen($num)-1] == '1'){
            // 'день';
        } elseif(in_array($num[strlen($num)-1], array(2,3))){
            // 'дня';
        } else {
            // 'дней';
        }
И чем меньше ты знаешь - тем больше будут платить тем, кто знает.:D
 

Фанат

oncle terrible
Команда форума
mirabo вот если ты будешь писать, как этот овнокодер, платить тебе не будут вообще
 

Adelf

Administrator
Команда форума
Решил-таки вставить свои пять копеек и описать редкий случай.
Иногда число дней может быть отрицательным. И тогда говнокод от damngood работает лучше :). Ибо остаток от деления на 10 от числа -1 например - это 9. А последний символ все равно 1.

"-1 дней" хуже смотрится, чем "-1 день".
 

mirabo

Новичок
Спасибо всем за участие! Решил все таки сам написать, не так уж долго, хоть и кривовато))) :
PHP:
        if( $ndata == '1'){ 
            echo "$ndata день";
        } elseif( substr($ndata, -1) == '2'){ 
            echo "$ndata дня"; 
		} elseif( substr($ndata, -1) == '3'){ 
            echo "$ndata дня"; 
		} elseif( substr($ndata, -1) == '4'){ 
            echo "$ndata дня"; 
        } else { 
            echo "$ndata дней"; 
        }
И ведь работает :)
 

damngood

Мозг был, но ушел...
Я на звание супер-пупер кодера не претендовал, дал пример, дальше каждый дрочит как он хочет. Я тут не сказал же что мой вариант - единственно верный. Сразу обозвали говнокодером. А я вот не люблю делить =р
 

vovanium

Новичок
Alexandre
Что ж ты лишаешь людей возможности самим подумать, какие еще есть числа исключения :)
 

mirabo

Новичок
Автор оригинала: vovanium
что-то у народа с математикой плохо :)
вы забыли про одну интересную вещь 4-дня, но 14-дней ;)
Спасибо! Ещё 101, 201 и т.д. добавил
PHP:
        if( $ndata == '1'){ 
            $ndata = "$ndata день";
        } elseif( $ndata == '2'){ 
            $ndata = "$ndata дня"; 		
        } elseif( $ndata == '3'){
            $ndata = "$ndata дня"; 
		} elseif( $ndata == '4'){
            $ndata = "$ndata дня";  
		} elseif( substr($ndata, -2) == '11'){ 
            $ndata = "$ndata дней";
		} elseif( substr($ndata, -2) == '12'){ 
            $ndata = "$ndata дней"; 
		} elseif( substr($ndata, -2) == '13'){ 
            $ndata = "$ndata дней";
		} elseif( substr($ndata, -2) == '14'){ 
            $ndata = "$ndata дней"; 
		} elseif( substr($ndata, -2) == '01'){ 
            $ndata = "$ndata день";	
		} elseif( substr($ndata, -1) == '2'){ 
            $ndata = "$ndata дня";
		} elseif( substr($ndata, -1) == '3'){ 
            $ndata = "$ndata дня";	
		} elseif( substr($ndata, -1) == '4'){ 
            $ndata = "$ndata дня";				    
        } else { 
            $ndata = "$ndata дней"; 
        }
	echo $ndata;
 

vovanium

Новичок
Ого :)
Я всё же настоятельно рекомендую почитать о арифметических операторах, более конкретно, что в php делает оператор %, а также почитать об логических операторах, в частности оператор "or" он же "||"
 

Духовность™

Продвинутый новичок
PHP:
/**
* Склонение существительных с числительными.
* Функция принимает число $n и три строки - 
* разные формы произношения измерения величины.
* Необходимая величина будет возвращена.
* Например: pluralForm(100, "рубль", "рубля", "рублей")
* вернёт "рублей".
* 
* @param int величина
* @param string форма1
* @param string форма2
* @param string форма3
* @return string
*/
function tpl_tpluralForm($n, $form1, $form2, $form3)
{
    $n = abs($n) % 100;
    $n1 = $n % 10;
	
    if ($n > 10 && $n < 20) {
        return $form3;
    }
	
    if ($n1 > 1 && $n1 < 5) {
        return $form2;
    }
	
    if ($n1 == 1) {
    return $form1;
    }
	
    return $form3;
}
 

Beavis

Banned
PHP:
    function plural($n, $form1, $form2, $form3) {
        $plural = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));
        switch($plural) {
            case 0:
            default:
                return $form1;
            case 1:
                return $form2;
            case 2:
                return $form3;
        }
    }
:))
 

dimagolov

Новичок
Beavis, ну и что, добился, чтобы код стал не читаемым и сложным для понимания? почему не так?
PHP:
function plural($n, $form1, $form2, $form3) {
switch($n%10==1&&$n%100!=11?0: ($n%10>=2&&$n%10<=4&&($n%100<10or$n%100>=20)?1:2)) {
case 0:default:return $form1;case 1:return $form2;case 2:return $form3;
}
}
 

vovanium

Новичок
я примерно такой функцией обхожусь :)
PHP:
function plural($n, $form1, $form2, $form3) { 
	return in_array($n % 10, array(2,3,4)) && !in_array($n % 100, array(11,12,13,14)) ? $form2 : ($n % 10 == 1 ? $form1 : $form3);
}
Beavis
Да кстати, а зачем тебе там default? типа возможны другие варианты кроме 0,1,2? :)
 
Сверху