Моя первый скрипт
Всем здравствуйте.
Вот уже почти 2 года прошло с того момента, как я зарегистрировался на этом портале с целью изучения языка JavaScript. Сказать по правде, продвинулся за столь долгое время не на много вперед. Не так давно приобрел книгу Д. Флэнаган - JavaScript. Подробное руководство.
С её помощью надеюсь у меня это получится! :-)
Цель ведения блога тут, научиться профессионально программировать на JavaScript, при помощи единомышленников на этом сайте.
Зачем оно мне надо? Это мое хобби.
Из вышеописанного следует, что начинать я буду с примитивов и постоянно расти.
На первый мой код меня натолкнул следующий листинг в книжке Флэнагана:
hex_string = "0x" + n.toString(16)
Как понятно из листинга, переменная n, к примеру, обладающая числовым значением 5 (в десятеричной системе счисления) переводится в шестнадцатеричную систему счисления (при помощи метода toString()) и присваивается переменной hex_string.
После прочтения листинга, мне захотелось самому написать скрипт, который бы переводил числа в любую из 3-х систем счисления (2,8,16). И спустя 2 часа мне это удалось :-)
Фрагмент html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<table cellpadding="1" cellspacing="1" border="0" width="500">
<form>
<tr>
<td>Введите число:</td>
<td><input type="text" id="stroka"></td>
</tr>
<tr>
<td>Выберите систему счисления:</td>
<td>
<select id="system" size="1">
<option value="2" onclick="num_to_s(this.value)">Двоичная</option>
<option value="8" onclick="num_to_s(this.value)">Восьмеричная</option>
<option value="16" onclick="num_to_s(this.value)">Шестнадцатеричная</option>
</select>
</td>
</tr>
<tr>
<td valign="top">Результат:</td>
<td><textarea id="res"></textarea></td>
</tr>
</form>
</table>
</body>
</html>
Код js:
function num_to_s(sys){
var chislo = Number(document.getElementById('stroka').value);
var res = document.getElementById('res');
if(sys == 16){
res.value='0x'+chislo.toString(16);
} else {
res.value=chislo.toString(sys);
}
if(isNaN(chislo)){
res.value='Введите число...';
res.style.backgroundColor='#ffff00';
} else {
res.style.backgroundColor='#ffffff';
}
}
Как это работает? Просто, вводите число, выбираете систему счисления и получаете результат.
UPD 1: В IE 8 не работает. Понимаю, что надо стремится к кроссбраузерности, но мне, пока, до этого далеко. Тестировал скрипт в FF 3.6.8
UPD 2: Пример на моей страничке
|
IE не понимает клика по опции. Вешайте тот же самый код на событие change самого комбобокса — всё будет работать.
Выбор системы счисления лучше сделать радиокнопкой — это сэкономит пользователю один клик. Непонятно, почему вывод идёт в textarea, а не ещё один input.
И советую пересмотреть всю вёрстку. Таблицы и HTML 4 Transitional — это же прошлый век.
Спасибо за совет, переписал под checkbox`ы, там с onChange все в порядке, да и лучше даже. Почему textarea, сам не знаю. На счет дизайна, попробую переделать с помощью CSS и div`ов.
UPD: IE8 при событие onChange, притормаживает вывод, переделываю обратно на onClick. В FF 3.6.8 все ок.
перевод чисел из любой системы счисления в любую другую
UPD: Ваш код не работает. NaN и все. Проверял в ff 3.6.8 и ie 8
var nsys = function(num, sys) { return Number(parseFloat(num.toString(sys))); }
Необходимости в переменной sys2 вообще нет. Т.к. переменной num можно присвоить любое значение - 1.00e+23, 10001110010, 0xfffe1 и функция корректно переведет.
Так даже элегантнее получился код
Зачем приводить результат к Number? В итоге получим то же, что было на входе.
Я не знаю почему вы получили, то же, что и на входе. Данные из формы передаются как строки, parseFloat округляет и преобразует в числовой формат строку. Number более радикальный способ перевода строки в числовой формат, своего рода подстраховка получается. ;-)
Если не верите можете посмотреть тут, в разделе склад.
Названия доставляют: "chislo", "stroka"
попробуйте вот такой скрипт:
function to16(n10){
h="0123456789abcdef"
k=n10
x=new Array()
rezult="0x"
for (i=0;n10>=16; i++){j=n10%16
x[i]=j
n10=(n10-x[i])/16
}
x[i]=n10
for (i=x.length-1; i>=0; i--){ rezult+= h.charAt(x[i]) }
return rezult
}
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.