powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Осталось дней, дня, день
22 сообщений из 22, страница 1 из 1
Осталось дней, дня, день
    #35124847
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Столкнулся с совершенно простой на первый взгляд проблемой.

Есть даты, скрипт вычисляет сколько дней осталось до них.

Нужно выводить 21 день
3647 дней

23 дня

и т.д.

Так вот - как научить скрипт распознавать дней/дня/день?
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35124960
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если предпоследня цифра 1, то "дней"
иначе если последняя цифра 0 или >=5, то "дней"
иначе если последняя цифра 2,3 или 4, то "дня"
иначе "день".
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35124977
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну сам алгоритм понятен :)
как отследить последнюю цифру?
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35124994
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
twistfireкак отследить последнюю цифру?смотря в каком виде у вас это число.
либо остаток от деления на 10, либо последний символ строки.
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35126275
Фотография akopium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РЕБЯТА, все правильно, только есть исключение: числа от 11 до 20 будут заканчиваться дней, так что отслеживать надо 2 последние цифры
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35126291
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akopiumРЕБЯТА, все правильно, только есть исключение: числа от 11 до 20 будут заканчиваться дней, так что отслеживать надо 2 последние цифрыЕсли вы внимательно прочитаете мой первый пост в этой теме, то там это уже есть.
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35127967
Фотография akopium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
12 дней
13 дней
и
22 дня
23 дня

ну и....?
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128000
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akopium miksoft
12 дней
13 дней
и
22 дня
23 дня

ну и....?это я вас должен спросить "ну и?"
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128232
shifteee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
// Образка первой цифры
$len = strlen($head);
$leng = $len - (2 * $len - 1);
$str = substr($head, 0, $leng);
//Образка остальных цифр
$n_str = substr($head, 1);
echo "<b><span class='style1'>".$str."</span><span class='style2'>".$n_str."</span>";

И проверяй на что конечается)
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128326
2117
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
...=~/(\d{ 2 }$)/;
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128449
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shifteee// Образка первой цифры
$len = strlen($head);
$leng = $len - (2 * $len - 1);
$str = substr($head, 0, $leng);
//Образка остальных цифр
$n_str = substr($head, 1);
echo "<b><span class='style1'>".$str."</span><span class='style2'>".$n_str."</span>";

И проверяй на что конечается)

Я так понимаю это работает только со строками?
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128455
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
последнюю цифру выделить проще:

$str = substr($head,$len-1,1);
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128513
shifteeeНапи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
twistfire shifteee// Образка первой цифры
$len = strlen($head);
$leng = $len - (2 * $len - 1);
$str = substr($head, 0, $leng);
//Образка остальных цифр
$n_str = substr($head, 1);
echo "<b><span class='style1'>".$str."</span><span class='style2'>".$n_str."</span>";

И проверяй на что конечается)

Я так понимаю это работает только со строками?


Просто взял кусок из своего кода для строковой переменно без модернизаций :)
Но методика в принципе одна.
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128632
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант для числовых значение можно использовать следующее:
Код: plaintext
1.
2.
$a =  21355 ;			// число
$x = floor($a /  10 ) %  10 ;	// предпоследняя цифра
$y = $a %  10 ;			// последняя цифра
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #35128640
I_Work
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно даже обойтись без floor:
Код: plaintext
1.
2.
$a =  21355 ;		// число
$x = $a /  10  %  10 ;	// предпоследняя цифра
$y = $a %  10 ;		// последняя цифра
Для строк однозначно в том или ином виде необходима проверка длины.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Осталось дней, дня, день
    #37985279
inetsurface
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
function days($d) {
	$y = $d % 10;
	$x = $d / 10 % 10;
	if ($x && $x == 1) return "дней";
	if ($y == 1) return "день";
	if (in_array($y,"2,3,4")) return "дня";
	return "дней";
}
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #38163982
kopo4etop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мой вариант

function BalanceDay($d) {
if($d == 1)
return "день";

if($d >=5 && $d <= 20)
return "дней";

$x = $d % 10;
if($x == 1)
return "день";
if($x == 2 || $x == 3 || $x == 4)
return "дня";

return "дней";
}
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #38163988
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
(($number % 10 == 1) && ($number % 100 != 11))
    ? 0
    : ((($number % 10 >= 2)
        && ($number % 10 <= 4)
        && (($number % 100 < 10)
        || ($number % 100 >= 20)))
            ? 1
            : 2
);
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #38164173
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
(($number % 10 == 1) && ($number % 100 != 11))
    ? 0
    : ((($number % 10 >= 2)
        && ($number % 10 <= 4)
        && (($number % 100 < 10)
        || ($number % 100 >= 20)))
            ? 1
            : 2
);



осталось в одну строку записать :))

переработаный ... двоичный:
Код: php
1.
2.
3.
4.
    $a = 1500; //количество дней
    $x = $a % 100;
    $y = ($x % 10)-1;
    $day = $x==1 ? 'день' : ($y&12 ? 'дней' : ($y&3 ? 'дня' : 'день'));
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #38164183
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hotfix. Сорри. поспешил, с десятками ошибся
Код: php
1.
2.
3.
4.
    $a = 1500; //количество дней
    $x = $a % 100;
    $y = ($x % 10)-1;
    $day = ($x/10)>>0==1 ? 'дней' : ($y&12 ? 'дней' : ($y&3 ? 'дня' : 'день'));
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Осталось дней, дня, день
    #38575724
Игорь Xaoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом варианте ошибка!!!
function days($d) {
$y = $d % 10;
$x = $d / 10 % 10;
if ($x && $x == 1) return "дней";
if ($y == 1) return "день";
if (in_array($y,"2,3,4")) return "дня";
return "дней";
}

Посмотрите внимательно документацию по функции in_array.
У меня все заработало вот с такой правкой:

if (in_array($y, array("2,3,4"))) return "дня";
...
Рейтинг: 0 / 0
Осталось дней, дня, день
    #38575839
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Xaoc,

Ай малацца! Нашел ошибку в древнем, никому не нужном г...нокоде! Дай пять!
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Осталось дней, дня, день
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]