Перейти к содержимому

Как сделать калькулятор на javascript

  • автор:

Пишем калькулятор на JavaScript

В этой статье мы с вами, как следует из названия, напишем простой калькулятор на JavaScript.

Желание написать калькулятор возникло у меня после просмотра одного туториала, посвященного созданию «simple calculator», который оказался далеко не симпл и толком ничего не умел делать.

Наш калькулятор будет true simple (42 строки кода, включая пробелы между блоками), но при этом полнофункциональным и масштабируемым.

Без дальнейших предисловий, приступаем к делу.

Наша разметка выглядит так:

Здесь мы подключаем библиотеку, создаем контейнер для калькулятора и поле для вводимых символов и результата.

Подключаем стили:

* < margin: 0; padding: 0; box-sizing: border-box; >body < height: 100vh; background: radial-gradient(circle, skyblue, steelblue); display: flex; justify-content: center; align-items: center; >.calculator < width: 320px; height: 480px; background: #eee; border-radius: 5px; box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2), -2px -2px 3px rgba(0, 0, 0, 0.2); >output < display: flex; justify-content: center; align-items: center; width: 300px; height: 40px; background: #fff; margin: 10px auto; border-radius: 5px; font-size: 1.4em; font-weight: bold; box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.3), inset -1px -1px 1px rgba(0, 0, 0, 0.3); >.keyboard < height: 440px; display: flex; flex-wrap: wrap; justify-content: space-evenly; align-items: flex-start; >button

Вот что мы имеем на данный момент:

Кнопки будут генерироваться программно.

Переходим к скрипту.

Определяем поле для вывода результата и создаем контейнер для клавиатуры:

const output = document.querySelector('output') const div = document.createElement('div') div.classList.add('keyboard') document.querySelector('.calculator').appendChild(div) 

Наша строка с символами выглядит так:

'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) =' 

Преобразуем данную строку в массив и создаем кнопки:

// разделителем служит пустая строка // можно было бы обойтись без пробелов, если бы у нас не было "CE" 'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) ='.split(' ') // пробегаемся по массиву // для каждого символа // создаем кнопку с помощью строкового литерала // записываем значение символа в атрибут "value" кнопки .map(symbol => < div.insertAdjacentHTML('beforeend', `">$ `) >) 

Находим созданные кнопки и добавляем к ним обработчик события «клик»:

document.querySelectorAll('button').forEach(button => < button.addEventListener('click', function () < // по клику вызывается функция со значением кнопки в качестве параметра calc(this.value) >) >) 

Мы также хотим иметь возможность вводить символы с помощью клавиатуры. Для этого нам необходимо добавить обработчик события «нажатие клавиши» к объекту «Document» или «Window», затем отфильтровать ненужные значения свойства «ключ» клавиши, например, с помощью регулярного выражения:

document.addEventListener('keydown', event => < if ((event.key).match(/[0-9%\/*\-+\(\)=]|Backspace|Enter/)) calc(event.key) >) 

Метод «match» в данном случае играет роль фильтра: он не позволяет передавать функции «calc» аргумент, не соответствующий заданному в нем условию.

Само условие звучит так: если значением event.key является один из символов, указанных в квадратных скобках ([]; цифра от 0 до 9, знаки деления, умножения, сложения, вычитания, открывающая, закрывающая круглые скобки или знак равенства; обратная косая черта — экранирование) или (| — альтерация) Backspace, или Enter, то вызываем calc с event.key в качестве параметра, иначе ничего не делаем (Shift также успешно отбрасывается).

Наша главная (и единственная) функция «calc» выглядит следующим образом (код следует читать снизу вверх):

// функция принимает значение кнопки или ключ клавиши function calc(value) < // если нажат знак равенства или Enter if (value.match(/=|Enter/)) < // пробуем выполнить операцию try < // вычисляем значение строки // это возможно благодаря методу "evaluate" объекта "math" // Math.trunc используется для округления до целого числа output.textContent = Math.trunc(math.evaluate(output.textContent)) // если операцию выполнить невозможно >catch < // сохраняем значение поля let oldValue = output.textContent // создаем новую переменную let newValue = 'недопустимое выражение' // выводим значение новой переменной в поле output.textContent = newValue // через полторы секунды возвращаем полю старое значение setTimeout(() =>< output.textContent = oldValue >, 1500) > // если нажат символ "C" > else if (value === 'C') < // очищаем поле output.textContent = '' // если нажат символ "СЕ" или Backspace >else if (value.match(/CE|Backspace/)) < // уменьшаем строку на один символ output.textContent = output.textContent.substring(0, output.textContent.length - 1) // если нажата любая другая (отфильтрованная) кнопка или клавиша >else < // записываем ее значение в поле output.textContent += value >> 

В завершение, парочка слов о заявленной масштабируемости и полнофункциональности.

Метод «evaluate» (ранее «eval») и другие методы Math.js имеют очень большие возможности. Опираясь на эти возможности, мы можем легко расширить функционал нашего калькулятора, добавив в него новые символы и операторы, предусмотрев возможность работы с числами с плавающей точкой (регулируя количество знаков после запятой с помощью переключателя и метода «toFixed») и т.д.

Благодарю за внимание. Надеюсь, вы нашли для себя что-то полезное. Хороших выходных и счастливого кодинга.

JavaScript

При установке синтаксиса JavaScript область кода выражения должна содержать скрипт JavaScript.

Примечание. Наименования полей/переменных/выражений чувствительны к регистру.

Следующий пример демонстрирует вычисление суммы двух полей Калькулятора:

// Вычисление суммы полей let result; result = COL1 + COL2; return result; 

В теле скрипта можно использовать ссылки на другие поля или переменные Калькулятора, в том числе новые, созданные в списке выражений. Через промежуточное выражение с типом Переменный можно передать массив. Ко входным Переменным можно обращаться через объект this.Var. .

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

В данном примере для вычисления переменной result используются ссылки на поля с именами COL1 и COL2 .

Для вывода результата в вычисляемое поле калькулятора используется команда return , которая возвращает значение переменной result , содержащей вычисленную сумму полей Калькулятора.

Важно: скрипт необходимо завершать командой return , которая выводит результат в вычисляемое поле калькулятора. В противном случае скрипт будет выполнен, но результат не будет выведен в вычисляемое поле.

Компактный вариант кода вычисления суммы полей калькулятора:

// Вычисление суммы полей return COL1 + COL2; 

Пример вычисления степени числа:

// Функция вычисления степени числа function pow(x, n)  if (n != 1)  return x * pow(x, n - 1); > else  return x; > > // Вывод результата функции в поле калькулятора return pow(COL1, COL2); 

В данном скрипте определена функция pow(x, n) , принимающая в качестве аргументов число и степень, в которую оно возводится. Для вывода результата скрипта в вычисляемое поле калькулятора используется команда return pow(COL1, COL2) , где pow(COL1, COL2) — вызов объявленной функции с передачей параметрам х и n значений из полей (или переменных) калькулятора COL1 и COL2 соответственно.

В коде JavaScript можно использовать встроенные функции Калькулятора:

function my_concat(x, n)  let s; // s = x.concat(n); - используется метод JavaScript s = Concat(x,n); // - используется функция калькулятора return s; > return my_concat(COL1, COL2); 

Наименования встроенных функций Калькулятора и JavaScript не пересекаются. Функции Калькулятора всегда начинаются с большой буквы, однако, их можно переопределить в коде JS. Явного импорта функций Калькулятора (как это делается в компоненте JavaScript) делать не нужно.

Примечание: в отличии от компонента JavaScript в Калькуляторе не поддерживается объект Promise.

Импорт внешних модулей

Как и в компоненте JavaScript поддерживаются внешние модули, но в Калькуляторе возможно использование только модульной системы CommonJS. Модульная система ES6 (ECMAScript 6) не поддерживается. С примерами и документацией использования модулей CommonJS можно ознакомится в статье JavaScript: Импорт внешних модулей.

Особенности применения внешних модулей

Для импорта модуля CommonJS применяется функция require . Пример:

const foo = require("foo/foo.js"); 

Инициализация объектов модуля происходит при первом таком вызове, при последующих используется кэш, в котором сохраняется состояние объектов модуля предыдущего вызова. Поскольку в Калькуляторе для каждой из вычисляемых ячеек таблицы происходит выполнение скрипта, то содержащийся в нем вызов require модуля происходит многократно и используется кэш. Таким образом измененное состояние объектов модуля может передаваться от вызова к вызову. Это необходимо учитывать и при необходимости очищать кэш, доступный через объект require.cache :

let path = require.resolve("foo/foo.js"); delete require.cache[path]; // Очищается кэш модуля "foo/foo.js" 

Важно: использование кэша для передачи значений между вызовами require может привести к непредсказуемым результатам вычислений в виду использования многопоточности вычислений.

Панель быстрого доступа

На панели расположена кнопка вызова окна Предпросмотра и кнопки, по нажатию на которые в область кода выражения вставляется заготовка либо шаблон.

Предпросмотр — позволяет оценить корректность расчетов, отображая до 100 первых строк результирующей таблицы. Горячая клавиша вызова — F3 .

  • — для ввода вещественного числа, будет вставлено 0.0 ;
  • — для ввода строки, будет вставлено «» ;
  • — для ввода даты, будет вставлена конструкция создания объекта, содержащего текущую дату. Пример: new Date(2020, 1, 5) ;
  • — для ввода даты/времени, будет вставлена конструкция создания объекта, содержащего текущее дата/время. Пример: new Date(2020, 1, 5, 13, 12, 50, 100) .

Простой скрипт калькулятора на JavaScript

Использование JavaScript простой и очевидный вариант при реализации простых калькуляторов, призванных заменить публикацию на сайте больших таблиц и для добавления некоторой интерактивности.

Рассмотрим простой калькулятор на чистом JavaScript (без использования библиотек типа jQuery и пр.) использующий функции уникализации и сортировки данных в массиве.
Калькулятором будем считать стоимость квартир основываясь на стоимости квадратного метра и площади соответственно. При этом данные (значения тегов ) в выпадающих списках (теги ) будут заполняться автоматически и в зависимости от остальных.

 
Комнаты
Этаж
Площадь
Сумма
function sortNumber(a,b) // функция для сортировки одномерного массива { return a - b; } function sortArray(a,b) { // функция для сортировки многомерного массива по первому индексу if (a[0]b[0]) return -1; if (a[0]>b[0]) return 1; return 0; } function unique(a) // функция уникализации значений массива { var r = new Array(); o:for(var i = 0, n = a.length; i  n; i++) { for(var x = 0, y = r.length; x  y; x++) { if(r[x]==a[i]) continue o; } r[r.length] = a[i]; } return r; } // произвольные данные [площадь, этаж, цена] var room0 = [[0, 0, 0]]; var room1 = [[40, 1, 20], [50, 3, 25], [53, 3, 30]]; var room2 = [[70, 1, 40], [72, 1, 35], [73, 5, 38]]; function calc(par) { // квартиры if (par == 0) { roomx = room0 }; if (par == 1) { roomx = room1 }; if (par == 2) { roomx = room2 }; var floorarray = new Array(); for (i = 0; i  roomx.length; i++) { floorarray[i] = roomx[i][1]; } var uniquefloor = new Array(); uniquefloor = unique(floorarray); uniquefloor = uniquefloor.sort(sortNumber); // этажи var objFloor = document.getElementById("floor"); if (par != 'floor' && par != 'area') { objFloor.length = 0; for (i = 0; i  uniquefloor.length; i++) { objFloor.options[objFloor.options.length] = new Option(uniquefloor[i]+' этаж', uniquefloor[i]); } } var areaarray = new Array(); areaarray = roomx; areaarray = areaarray.sort(sortArray); var floorvalue = objFloor.options[objFloor.selectedIndex].value; var objArea = document.getElementById("area"); // площади if (par != 'area') { objArea.length = 0; for (k = 0; k  roomx.length; k++) { if (roomx[k][1] == floorvalue) { objArea.options[objArea.options.length] = new Option(areaarray[k][0],areaarray[k][2]); } } } // сумма area = objArea.options[objArea.selectedIndex].text; price = objArea.options[objArea.selectedIndex].value; summ = Number(price)*Number(area); document.form.summ.value = summ; return false; }

Пример работы нашего простого JavaScript калькулятора:

Некоторые полезные ссылки по функциям JavaScript, использованным в примере:

  • Сортировка многомерных массивов в JavaScript
  • Удаление дубликатов из массивов в JavaScript
  • Создание динамических списков с помощью JavaScript

Простой калькулятор на чистом javascript

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

HTML файл:

Для начала как всегда начнём с HTML страницы и тут конечно не чего сложного нет.

Вот такой, совсем короткий HTML получается, кратко расскажу о нём.

Атрибут onclick , это событие клика мыши на элемент, в параметрах задаётся функция, которая будет запускаться при клики на элемент, это в принципе всё что нужно знать.

JavaScript файл:

Вот тут всё не много сложнее, но я постараюсь всё объяснить максимально понятным языком.

JavaScript
let num1 ; // Создаём переменную где будет хранится значение первого числа
let num2 ; // Создаём переменную где будет хранится значение второго числа
// Создаём переменную и берём элемент, куда будет выводится результат
let out = document . getElementById ( ‘out’ ) ;
// функция сложения
function plus ( ) < num1 = document . getElementById ( 'n1' ) . value ; num1 = parseInt ( num1 ) num2 = document . getElementById ( 'n2' ) . value ; num2 = parseInt ( num2 ) out . innerHTML = num1 + num2 ; // функция вычитания function minus ( ) < num1 = document . getElementById ( 'n1' ) . value ; num1 = parseInt ( num1 ) num2 = document . getElementById ( 'n2' ) . value ; num2 = parseInt ( num2 ) out . innerHTML = num1 - num2 ; // функция умножения function multiplication ( ) < num1 = document . getElementById ( 'n1' ) . value ; num1 = parseInt ( num1 ) num2 = document . getElementById ( 'n2' ) . value ; num2 = parseInt ( num2 ) out . innerHTML = num1 * num2 ; // функция деления function division ( ) < num1 = document . getElementById ( 'n1' ) . value ; num1 = parseInt ( num1 ) num2 = document . getElementById ( 'n2' ) . value ; num2 = parseInt ( num2 ) out . innerHTML = num1 / num2 ;

Давайте не много расскажу, что тут вообще происходит.

В начале просто создаём переменные которые нам могут пригодится, это первое число и второе, потом берём элемент, куда будем выводить значения которое получим.

Теперь подробно рассмотрим функции, я не буду все рассматривать, так как не чего почти не меняется, только действии.

Сначала, мы берём первое число из формы и ложем его в нашу переменную для первого значения, точнее берём строку, поэтому строчкой ниже мы переводим стоку в число, если там будут буквы, то он вернёт NaN или нет числа, точно также всё делаем и со вторым числом, только уже используем переменную, которую подготовили для второго числа.

В последней строчке функции мы складываем две переменные и выводим значение в элементе out .

Как то так и работает наша программа, дальше всё одинаковое, единственное различии, только в действии.

Вывод:

Вот такой простой калькулятор получился на чистом JavaScript, единственный существенный не достаток, в том, что событие вызываются устаревшим образом, сейчас их правильно вызывать через addEventListener() , я не стал его использовать по двум причинам, во первых, мне кажется для новичков такой способ не много легче, а эта статья именно для новичков, во вторых, если вы не знали о таком способе, то его обязательно надо знать, так как, не всегда вы будите работать со современном кодам, на старых сайтах используется такой способ.

В будущем может напишу статью, где буду делать более продвинутый калькулятор, поэтому, что бы не пропустить подписываетесь на все соц-сети.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *