Страница 1 из 11
Модератор форума: JonMagon 
Сообщество uCoz » Вебмастеру » JavaScript, Flash и прочие технологии » JavaScript » Склонение слова
Склонение слова
bit_vlad
Сообщений: 75
Репутация: -12

Сообщение # 1 | 16:47:33
Всем привет smile
Друзья помогите сделать склонение слова в скрипте...
Нужно сделать что бы когда оставалось № дней до события писало 1 день, 2 дня, 5 дней и т.д.

Вот сам скрипт:

Код
<script>
document.write('<span id="ngdat">Осталось</span>')
function ojidanieNG()
{
var today = new Date();

var BigDay = new Date("$OTHER5$");
var timeLeft = (BigDay.getTime() - today.getTime());

var e_daysLeft = timeLeft / 86400000;
var daysLeft = Math.floor(e_daysLeft);

var e_hrsLeft = (e_daysLeft - daysLeft)*24;
var hrsLeft = Math.floor(e_hrsLeft);

var e_minsLeft = (e_hrsLeft - hrsLeft)*60;
var minsLeft = Math.floor(e_minsLeft);

var seksLeft = Math.floor((e_minsLeft - minsLeft)*60);

if (BigDay.getTime() > today.getTime() )  
document.getElementById("ngdat").innerHTML = '<span style="font-size:10pt"><font color=#5D94BE><b>Осталось</font><font color="#ff6600">:</font> '+daysLeft+' <font color="#ff6600">дней</font> '+hrsLeft+'<font color="#ff6600">:</font>'+minsLeft+'<font color="#ff6600">:</font>'+seksLeft+'</b></span>'
else
document.getElementById("ngdat").innerHTML = 'С новым годом!!!'
}
setInterval("ojidanieNG()", 50)
</script>
Сообщение отредактировал bit_vlad - Воскресенье, 31 Янв 2016, 16:48:41
PtrPt
Сообщений: 88
Репутация: 33

Сообщение # 2 | 18:41:46
bit_vlad, давайте попробуем!

1) Вспоминаем русский язык.

Основное правило:
*1 - день
*(2..4) - дня
*(0,5..9) - дней
Исключения: 11..14 - дней

2) Вспоминаем математику:

Чтобы найти последнюю цифру числа, надо найти остаток от деления на 10.

3) Вспоминаем наш славный и могучий JS:

Код
function getEnding(n,w1,w2,w5) {
var w;
if((n>=11)&(n<=14)) {
w=w1;
} else {
var k=n%10;
if(k==1) {
w=w1;
} else {
if((k>=2)&(k<=4)) {
w=w2;
} else {
w=w5;
};};};
return w;
};

Эта функия возвращает слово в нужной форме.

Чтобы её вызвать, используем код

Код
daysText=getEnding(daysLeft,'день','дня','дней');

Теперь замените в строке

Код
<b>Осталось</font><font color="#ff6600">:</font> '+daysLeft+' <font color="#ff6600">дней</font>

слово " дней " на выражение " '+daysText+' ", т.е. получим:

Код
<b>Осталось</font><font color="#ff6600">:</font> '+daysLeft+' <font color="#ff6600">'+daysText+'</font>

4) Вроде бы всё! smile

Добавлено (31 Янв 2016, 18:41:46)
---------------------------------------------
Ой, опечаточка! В обработке исключений вместо w5 написал w1 по ошибке. Извините. Вот исправленная функция:

Код
function getEnding(n,w1,w2,w5) {
var w;
if((n>=11)&(n<=14)) {
w=w5;
} else {
var k=n%10;
if(k==1) {
w=w1;
} else {
if((k>=2)&(k<=4)) {
w=w2;
} else {
w=w5;
};};};
return w;
};

Элегантный uCoz :)
bit_vlad
Сообщений: 75
Репутация: -12

Сообщение # 3 | 19:11:11
Так куда это вставить?

Код
function getEnding(n,w1,w2,w5) {
var w;
if((n>=11)&(n<=14)) {
w=w5;
} else {
var k=n%10;
if(k==1) {
w=w1;
} else {
if((k>=2)&(k<=4)) {
w=w2;
} else {
w=w5;
};};};
return w;
};

я не понимаю в скриптах просто нашел готовый и хочу изменить
PtrPt
Сообщений: 88
Репутация: 33

Сообщение # 4 | 21:40:59
bit_vlad, вот, объединил весь скрипт:

Код
<script>
function getEnding(n,w1,w2,w5) {
var w;
if((n>=11)&(n<=14)) {
w=w5;
} else {
var k=n%10;
if(k==1) {
w=w1;
} else {
if((k>=2)&(k<=4)) {
w=w2;
} else {
w=w5;
};};};
return w;
};
document.write('<span id="ngdat">Осталось</span>')
function ojidanieNG()
{
var today = new Date();

var BigDay = new Date("$OTHER5$");
var timeLeft = (BigDay.getTime() - today.getTime());

var e_daysLeft = timeLeft / 86400000;
var daysLeft = Math.floor(e_daysLeft);

var e_hrsLeft = (e_daysLeft - daysLeft)*24;
var hrsLeft = Math.floor(e_hrsLeft);

var e_minsLeft = (e_hrsLeft - hrsLeft)*60;
var minsLeft = Math.floor(e_minsLeft);

var seksLeft = Math.floor((e_minsLeft - minsLeft)*60);

var daysText=getEnding(daysLeft,'день','дня','дней');

if (BigDay.getTime() > today.getTime() )  
document.getElementById("ngdat").innerHTML = '<span style="font-size:10pt"><font color=#5D94BE><b>Осталось</font><font color="#ff6600">:</font> '+daysLeft+' <font color="#ff6600">'+daysText+'</font> '+hrsLeft+'<font color="#ff6600">:</font>'+minsLeft+'<font color="#ff6600">:</font>'+seksLeft+'</b></span>'
else
document.getElementById("ngdat").innerHTML = 'С новым годом!!!'
}
setInterval("ojidanieNG()", 50)
</script>

Цитата
setInterval("ojidanieNG()", 50)

Это слишком частое обновление: 20 раз в секунду. Думаю, 2 раза в секунду будет вполне достаточно. Зачем такая точность? (Честно говоря, и одного раза в секунду как раз достаточно - погрешность не будет превосходить 0,5 сек.) Рекомендую поменять на

Код
setInterval("ojidanieNG()", 500)

или даже на

Код
setInterval("ojidanieNG()", 1000)

Цитата
var BigDay = new Date("$OTHER5$");

Если именно до Нового года, зачем зря тратить $OTHER5$?

Можно заменить на

Код
var BigDay = new Date(<? $YEAR$+1 ?>, 0, 1);

...Извините за нескромный вопрос, но зачем Вам так рано отсчёт до Нового года, да ещё и с секундами? smile

Элегантный uCoz :)
bit_vlad
Сообщений: 75
Репутация: -12

Сообщение # 5 | 23:36:10
PtrPt, Благодарю за помощь respect
Цитата PtrPt ()
...Извините за нескромный вопрос, но зачем Вам так рано отсчёт до Нового года, да ещё и с секундами?

Я использую этот скрипт для другой цели wink для отсчета до выхода фильма
Сообщество uCoz » Вебмастеру » JavaScript, Flash и прочие технологии » JavaScript » Склонение слова
Страница 1 из 11
Поиск: