1 (изменено: stir, 2011-10-11 13:43:49)

Тема: JS: автовывод размера

Простой код собрал в функцию для автовывода сообщения о подсчете занимаемого места файлами и не вижу своего косяка в коде, помогите - почему он выдает вместо, например, 91 мегабайт - 0,091 гигабайт??

<script type="text/javascript">
function output(raz) {
//вывод авто по текущему размеру обекта в байтах и выше по ГОСТ
if (raz<0) alert ("По предварительным данным произошла ошибка в программе,"+ '\n' +"размер объекта не может быть отрицательным числом: "+raz);
if (0<=raz<1000) razmer=raz+' B';
if (1000<=raz<1000000) razmer=(raz/1000)+' kB';
if (1000000<=raz<1000000000) razmer=(raz/1000000)+' MB';
if (1000000000<=raz<1000000000000) razmer=(raz/1000000000)+' GB';
else razmer=(raz/1000000000000)+' TB';
window.razmer=razmer;
}
</script>

применяю в теле проги, вот часть кода HTML:

]<script type="text/javascript">
//...
//подсчет размеров файлов для 99тхт файла и
var v99=new Array();
var s99=0;
var nnn99=tx99.length;
var fso99 = new ActiveXObject("Scripting.FileSystemObject");
for (var i = 0; i < nnn99; i++)
    {
    var namev99=tx99[i];
    //alert('namev99= '+namev99);    
    var ts=fso99.GetFile(namev99);
    v99[i]=ts.Size;
    s99=s99+v99[i];
    }
//отобразить автоматически в кило мега или гига байтах
alert("s99 = "+s99);//для контроля значение
output(s99);    
alert("кол-во файлов в массиве v99 = "+nnn99+', общим объемом '+razmer);
//...

Все вроде просто..но чего-то упускаю из вида..

Любители построили Ковчег, а профессионалы - Титаник.

2

Re: JS: автовывод размера

Похоже он исполняется только как ОДНО если - то или 1 иначе, т.е. только его чать:

if (1000000000<=raz<1000000000000) razmer=(raz/1000000000)+' GB';
else razmer=(raz/1000000000000)+' TB';

а все выше - просто отбрасывается..

можно конечно попробовать switch, но его конструкция в явном виде не годится...

Любители построили Ковчег, а профессионалы - Титаник.

3 (изменено: Spy00000, 2011-10-11 14:42:44)

Re: JS: автовывод размера

У Вас всё выполняется в соответствии с алгоритмом, который Вы НАПИСАЛИ.
То, что Вы ХОТИТЕ правильнее пишется так:

function output(raz) {
//вывод авто по текущему размеру обекта в байтах и выше по ГОСТ
if (raz<0) alert ("По предварительным данным произошла ошибка в программе,"+ '\n' +"размер объекта не может быть отрицательным числом: "+raz);
else if ((0<=raz)&&(raz<1000)) razmer=raz+' B';
else if ((1000<=raz)&&(raz<1000000)) razmer=(raz/1000)+' kB';
else if ((1000000<=raz)&&(raz<1000000000)) razmer=(raz/1000000)+' MB';
else if ((1000000000<=raz)&&(raz<1000000000000)) razmer=(raz/1000000000)+' GB';
else razmer=(raz/1000000000000)+' TB';
window.razmer=razmer;
}

4

Re: JS: автовывод размера

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

Тоже писал такую функцию, но пользовался ей раза два, не более. Вот ее аналог. Не пугайтесь - она с виду такая страшная, но делает тоже самое, плюс еще пример в конце : )


Number.human = function(x, d)
{
	var n = Math.abs(x);

	var r = x;
	var s = '';

	var divs = arguments.callee.divs;
	for (var i = divs.length - 1; i >= 0; i--) {
		if ( n >= divs[i].d ) {
			r /= divs[i].d;
			s = divs[i].s;
			break;
		}
	}

	return r.toFixed(d) + s;
};

Number.human.divs = [
	{ d: 1e3,  s: ' K' }, 
	{ d: 1e6,  s: ' M' }, 
	{ d: 1e9,  s: ' G' }, 
	{ d: 1e12, s: ' T' }
];

n = 1234567890;
WScript.Echo(Number.human(n));
WScript.Echo(Number.human(n, 3));
( 2 * b ) || ! ( 2 * b )

5

Re: JS: автовывод размера

Большое спасибо Вам. Свой просчет понял и правильные коды получил от Вас.
Жаль, что я пока недорос до того уровня... некоторые конструкции еще для меня сложны, Rumata, нехватка опыта и малое время изучения сказываются, .
т.к. используется функция, то можно отказаться от этой строки и упростить код: var r = x;
сразу в код внести х вместо r .
/как говаривал один очень известный американец при создании сайтов (кодов) - Чем меньше, тем лучше!/

Любители построили Ковчег, а профессионалы - Титаник.