LINUX.ORG.RU

Как бы вы реализовали javascript функцию?..

 


0

1

На входе: миллисекунды или секунды с двузначной дробной частью на выбор (т.е. либо 123456 либо 1234.56).
Что нужно на выходе:

1:23:45:67, соответственно
H:MM:SS:MS

Я лично ее реализовывал несколько раз разными способами. Каждая из реализаций имела свои грабли (начиная от низкой производительности и заканчивая непонятными ошибками на ровном месте в мат. операциях).

P.S. Без сторонних библиотек. Ежели хотите использовать нестандартные функции - самостоятельно их описывайте в function foo() {}.
Когда значение каждой из позиций менее десяти - 0 желательно дописывать (0:03:01:01 вместо 0:3:1:01).

★★★★★

Очевидно, делением, округлением, вычитанием и конкатенацией. Не понимаю, как можно придумать много разных способов и какие могут быть подводные камни. Входное и выходное представление времени взаимно однозначно преобразуются.

amomymous ★★★
()
Ответ на: комментарий от amomymous

Да, это очевидно, что делением/округлением/вычитанием/конкатенацией, и я думал что этот таск уберпростой пока не начал его делать...
Есть возможность написать примерчик?

reprimand ★★★★★
() автор топика
Ответ на: комментарий от reprimand
function add0(s) {
return s < 10 ? ("0" + s) : s;
}
function timetohms(t)
{
// если t приходит в формате 1234.56, добавить t=Math.floor(t*1000)
var ms=t%1000;
t=(t-ms)/1000;
var s=t%60;
t=(t-s)/60;
var m=t%60;
t=(t-m)/60;
h=t;
return add0(h)+":"+add0(m)+":"+add0(s)+":"+add0(ms);
}

Как-то так, не проверял.

amomymous ★★★
()
Ответ на: комментарий от reprimand

Иногда вырастает хвост, в остальном всё хорошо. Думаю, надо добавить округление ms перед выводом, и этого будет достаточно.

amomymous ★★★
()
Ответ на: комментарий от amomymous

вот именно
прикол в том, что этот хвост - неведомая «странность». Я не знаю откуда он вырастает, и пытаюсь это выяснить

reprimand ★★★★★
() автор топика
Ответ на: комментарий от Dron

если бы в минуте было 100 секунд и в 1 часе было 100 минут, то твое решение было бы идеальным

reprimand ★★★★★
() автор топика
Ответ на: комментарий от amomymous

м-м-максимум хипстота

return add0(h)+":«+add0(m)+»:«+add0(s)+»:«+add0(ms);

[h,m,s,ms].map(add0).join(":")
mix_mix ★★★★★
()
Ответ на: комментарий от amomymous

такс!
я нашел либо баг либо неадекватное поведение numObj.toFixed([fractionDigits])

//	var TOTAL=audio.currentTime.toFixed(2)*100;
	var TOTAL=Math.floor(audio.currentTime*100);
я совершил замену избавившись от этой херни - и всё встало на свои места (live пример тоже обновлен)

UPD: Почитав оф. мануал я понял, что зря я вообще эту хрень использовал. Надо было не корчить из себя хипстера и сразу брать нормальные и проверенные функции

reprimand ★★★★★
() автор топика
Последнее исправление: reprimand (всего исправлений: 1)

Числа сделать как входной параметр к боле высоко-уровневым объектам.

Далее объект уже будет проще преобразовать к нужному виду, возможно по цепочке.

anonymous
()
Ответ на: комментарий от zz

что не объясняет появление необъяснимого «хвостика» в дробной части вида **.0000000001 или **.9999999998

reprimand ★★★★★
() автор топика
Ответ на: комментарий от reprimand

Конечно объясняет, то, что ты округлял, не представимо в виде конечной двоичной дроби.

zz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.