в скрипте цикл switch() работает неправильно

12 3
PK
На сайте с 24.10.2006
Offline
99
PSK
1609

Задача очень проста - отсчет дней до начала события. Но не могу понять почему не работает. Я из всего числа отнимаю сначала количество сотен, затем количество десятков. А остаток сравниваю с каждым числом и в соответствие сравнению вывожу результат. Глюк наипримитивнейший, третий час туплю уже. Please Help


<script language="javascript">
d0 = new Date('August 12, 2008');
d1 = new Date();
dt = (d0.getTime() - d1.getTime()) / (1000*60*60*24);

var x = Math.round(dt);

switch ( x - x/100*100 - ( x - x/100*100)/10*10 )
{
case 9: document.write( Math.round(dt) + " дней"); break;
case 8: document.write( Math.round(dt) + " дней"); break;
case 7: document.write( Math.round(dt) + " дней"); break;
case 6: document.write( Math.round(dt) + " дней"); break;
case 5: document.write( Math.round(dt) + " дней"); break;
case 4: document.write( Math.round(dt) + " дня"); break;
case 3: document.write( Math.round(dt) + " дня"); break;
case 2: document.write( Math.round(dt) + " дня"); break;
case 1: document.write( Math.round(dt) + " день"); break;
case 0: document.write( Math.round(dt) + " дней"); break;

default:document.write( Math.round(dt) + " дняя");
};
</script>
PK
На сайте с 24.10.2006
Offline
99
PSK
#1

цикл switch(). отлично сказал :) время сказывается. конечно же оператор!

dkameleon
На сайте с 09.12.2005
Offline
386
#2

скопировал код один в один. на первый взгляд всё работает.

детальнее опишите проблему.

Дизайн интерьера (http://balabukha.com/)
PK
На сайте с 24.10.2006
Offline
99
PSK
#3
dkameleon:
скопировал код один в один. на первый взгляд всё работает.
детальнее опишите проблему.

ну проблема в том, что когда количество дней например 660, то добавляется "дней". когда 653, то добавляется опять "дней". а хотелось бы "дня" чтобы добавлялось после числа

Dreammaker
На сайте с 20.04.2006
Offline
569
#4


dt = (d0.getTime() - d1.getTime()) / (1000*60*60*24) + 1;

Так вроде правильнее считает :) Если имелось в виду, то что день не доставало. По крайней мере в следующем месяце правильно считает..

Если проблема не в этом, то, плз, озвучьте её..

update: пока писал не было описания проблемы :)

PK
На сайте с 24.10.2006
Offline
99
PSK
#5
Dreammaker:

dt = (d0.getTime() - d1.getTime()) / (1000*60*60*24) + 1;


Так вроде правильнее считает :) Если имелось в виду, то что день не доставало. По крайней мере в следующем месяце правильно считает..

Если проблема не в этом, то, плз, озвучьте её..

update: пока писал не было описания проблемы :)

проблема следующая: отчитываются дни до заданного события. Сейчас например 655 дней. Если в поле

d0 = new Date('August 12, 2008');
задать 'August 11, 2008' , то скрипт опять сгенерирует 654 дней. 'August 10, 2008' - 653 дней и т.д.

Насколько я понял в операторе switch() выбирается всё время значение case 0. Оно в принципе и логично, если бы тип переменных был float. Но на момент написания скрипта я полагал, что JS работает только с целочисленным типом данных int.

Возможно Вы знаете как задать тип int в явном виде для переменной х?

PK
На сайте с 24.10.2006
Offline
99
PSK
#6

Задача вот какая:

Сейчас

659 дней

658 дней

657 дней

656 дней

655 дней

654 дней

653 дней

652 дней

651 дней

650 дней

А хотелось бы

659 дней

658 дней

657 дней

656 дней

655 дней

654 днЯ

653 днЯ

652 днЯ

651 день

650 дней

Коля Дубр
На сайте с 02.03.2005
Offline
153
#7

Как отсчитать кол-во дней - сами разбирайтесь, это не сложно. А вот выбрать правильную форму - задача несколько менее тривиальная. Вот кусочек кода, проверьте:


function getDays(x) {
var un = x - 10 * Math.floor(x / 10); // Единицы
var de = ((x - 100 * Math.floor(x / 100)) - un) / 10 ; // Десятки

var word = '';
switch (un) {
default:
word = 'дней';
break;
case 1:
word = (de != 1) ? 'день' : 'дней';
break;
case 2: case 3: case 4:
word = (de != 1) ? 'дня' : 'дней';
break;
}
return word;
}

for (var i = 0; i < 1000; i++) {
document.write(i + ' ' + getDays(i) + "<Br />");
}
Разрабатываю общую шину (http://habrahabr.ru/company/floxim/blog/268467/) помаленьку. ...а еще у меня есть бложек (http://www.blogovo.ru/).
Dreammaker
На сайте с 20.04.2006
Offline
569
#8

А вот и мой способ:


<script language="javascript">
d0 = new Date('August 12, 2008');

d1 = new Date();

dt = (d0.getTime() - d1.getTime()) / (1000*60*60*24) + 1;

var x = Math.round(dt);

var reg=/[34]$/;

var reg2=reg=/[12]$/;

r=(reg2.exec(x))?'день':(reg.exec(x))?'дня':'дней';

document.write(x +' ' + r);

</script>

Сама идея взята отсюда

http://www.simplex.ru/news/win/1-16.html

и переделана мной только что :) Оригинал для данной задачи не хотел работать, пришло основательно его обработать наждаком :)

update: при том так, что можно уже авторство было бы и не указывать :)

PK
На сайте с 24.10.2006
Offline
99
PSK
#9
Dreammaker:
А вот и мой способ:


<script language="javascript">
d0 = new Date('August 12, 2008');

d1 = new Date();

dt = (d0.getTime() - d1.getTime()) / (1000*60*60*24) + 1;

var x = Math.round(dt);

var reg=/[34]$/;

var reg2=reg=/[12]$/;

r=(reg2.exec(x))?'день':(reg.exec(x))?'дня':'дней';

document.write(x +' ' + r);

</script>


Сама идея взята отсюда
http://www.simplex.ru/news/win/1-16.html

и переделана мной только что :) Оригинал для данной задачи не хотел работать, пришло основательно его обработать наждаком :)

update: при том так, что можно уже авторство было бы и не указывать :)

что-то у меня по-прежнему всё время выдает "дней" для всех чисел )

PK
На сайте с 24.10.2006
Offline
99
PSK
#10
Коля Дубр:
Как отсчитать кол-во дней - сами разбирайтесь, это не сложно. А вот выбрать правильную форму - задача несколько менее тривиальная. Вот кусочек кода, проверьте:


function getDays(x) {
var un = x - 10 * Math.floor(x / 10); // Единицы
var de = ((x - 100 * Math.floor(x / 100)) - un) / 10 ; // Десятки

var word = '';
switch (un) {
default:
word = 'дней';
break;
case 1:
word = (de != 1) ? 'день' : 'дней';
break;
case 2: case 3: case 4:
word = (de != 1) ? 'дня' : 'дней';
break;
}
return word;
}

for (var i = 0; i < 1000; i++) {
document.write(i + ' ' + getDays(i) + "<Br />");
}

пасиба. завтра на свежую голову попробую довести до ума

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий