- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
const prevText = document.querySelector('[data-prev]');
const currentText = document.querySelector('[data-current]');
const buttons = document.querySelectorAll('.btn');
const resetBtn = document.querySelector('[data-reset]');
const delBtn = document.querySelector('[data-delete]');
const numberBtn = document.querySelectorAll('[data-number]');
const operationBtn = document.querySelectorAll('[data-operator]');
const equalBtn = document.querySelector('[data-equal]');
class Calculator {
constructor(prevText, currentText) {
this.prevText = prevText;
this.currentText = currentText;
this.clear();
}
clear() {
this.prev = '';
this.current = '';
this.operator = undefined;
}
delete() {
this.current = this.current.toString().slice(0, -1);
if (this.current === '') {
this.current = this.prev;
this.prev = '';
this.operator = undefined;
}
}
appendNumber(nr) {
this.current = this.current.toString() + nr.toString();
}
chooseOperation(operator) {
if (this.current === '') return;
if (this.prev !== '') {
this.calculate();
}
this.operator = operator;
this.prev = this.current;
this.current = '';
}
calculate() {
let result;
const previousValue = parseInt(this.prev);
const currentValue = parseInt(this.current);
if (isNaN(previousValue) || isNaN(currentValue)) return;
switch (this.operator) {
case '+':
result = previousValue + currentValue;
break;
case '-':
result = previousValue - currentValue;
break;
default:
return;
}
this.current = result;
this.operator = undefined;
this.prev = '';
}
getDisplayNr(nr) {
const floatNr = parseFloat(nr);
if (isNaN(floatNr)) return '';
return floatNr.toLocaleString('en');
}
updateDisplay() {
this.currentText.innerText = this.getDisplayNr(this.current);
// this.prevText.innerText = this.prev;
if (this.operator != null) {
this.prevText.innerText = ` ${this.getDisplayNr(this.prev)} ${
this.operator
}`;
} else {
this.prevText.innerText = '';
}
}
}
const calculator = new Calculator(prevText, currentText);
numberBtn.forEach((btn) => {
btn.addEventListener('click', () => {
calculator.appendNumber(btn.innerText);
calculator.updateDisplay();
});
});
operationBtn.forEach((btn) => {
btn.addEventListener('click', () => {
calculator.chooseOperation(btn.innerText);
calculator.updateDisplay();
});
});
equalBtn.addEventListener('click', (btn) => {
calculator.calculate();
calculator.updateDisplay();
});
resetBtn.addEventListener('click', (btn) => {
calculator.clear();
calculator.updateDisplay();
});
delBtn.addEventListener('click', (btn) => {
calculator.delete();
calculator.updateDisplay();
});
<div class="calculator">
<div class="calculation">
<div data-prev class="prev"></div>
<div data-current class="current"></div>
<!-- <div class="display">0</div> -->
</div>
<button class="bigger reset btn" data-reset>RES</button>
<button class="bigger delete btn" data-delete>DEL</button>
<button class="nr btn" data-number>1</button>
<button class="nr btn" data-number>2</button>
<button class="nr btn" data-number>3</button>
<button class="plus operator btn" data-key='plus' data-operator>+</button>
<button class="nr btn" data-number>4</button>
<button class="nr btn" data-number>5</button>
<button class="nr btn" data-number>6</button>
<button class="minus operator btn" data-key='minus' data-operator>-</button>
<button class="nr btn" data-number>7</button>
<button class="nr btn" data-number>8</button>
<button class="nr btn" data-number>9</button>
<button class="nr btn" data-number>0</button>
<button class="bigger equal btn" data-equal>=</button>
</div>
最佳答案
您可以在 checkOperator
方法中添加对 -
的检查。如果找到 -
并且 currentValue
为 null
,则将 currentValue
设置为 0
我在下面添加了两行;
if (this.current === '' && !operator == '-') return;
if (this.current === '' && operator == '-') this.current = 0;
请参阅下面的代码段:
const prevText = document.querySelector('[data-prev]');
const currentText = document.querySelector('[data-current]');
const buttons = document.querySelectorAll('.btn');
const resetBtn = document.querySelector('[data-reset]');
const delBtn = document.querySelector('[data-delete]');
const numberBtn = document.querySelectorAll('[data-number]');
const operationBtn = document.querySelectorAll('[data-operator]');
const equalBtn = document.querySelector('[data-equal]');
class Calculator {
constructor(prevText, currentText) {
this.prevText = prevText;
this.currentText = currentText;
this.clear();
}
clear() {
this.prev = '';
this.current = '';
this.operator = undefined;
}
delete() {
this.current = this.current.toString().slice(0, -1);
if (this.current === '') {
this.current = this.prev;
this.prev = '';
this.operator = undefined;
}
}
appendNumber(nr) {
this.current = this.current.toString() + nr.toString();
if(this.prev == '')
this.calculate();
}
chooseOperation(operator) {
if (this.current === '' && !operator == '-') return;
//if (this.current === '' && operator == '-') this.current = 0;
if (this.prev !== '') {
this.calculate();
}
this.operator = operator;
this.prev = this.current;
this.current = '';
}
calculate() {
let result;
const previousValue = parseInt(this.prev) || 0;
const currentValue = parseInt(this.current);
if (isNaN(previousValue) || isNaN(currentValue)) return;
switch (this.operator) {
case '+':
result = previousValue + currentValue;
break;
case '-':
result = previousValue - currentValue;
break;
default:
return;
}
this.current = result;
this.operator = undefined;
this.prev = '';
}
getDisplayNr(nr) {
const floatNr = parseFloat(nr);
if (isNaN(floatNr)) return '';
return floatNr.toLocaleString('en');
}
updateDisplay() {
this.currentText.innerText = this.getDisplayNr(this.current);
// this.prevText.innerText = this.prev;
if (this.operator != null) {
this.prevText.innerText = ` ${this.getDisplayNr(this.prev)} ${
this.operator
}`;
} else {
this.prevText.innerText = '';
}
}
}
const calculator = new Calculator(prevText, currentText);
numberBtn.forEach((btn) => {
btn.addEventListener('click', () => {
calculator.appendNumber(btn.innerText);
calculator.updateDisplay();
});
});
operationBtn.forEach((btn) => {
btn.addEventListener('click', () => {
calculator.chooseOperation(btn.innerText);
calculator.updateDisplay();
});
});
equalBtn.addEventListener('click', (btn) => {
calculator.calculate();
calculator.updateDisplay();
});
resetBtn.addEventListener('click', (btn) => {
calculator.clear();
calculator.updateDisplay();
});
delBtn.addEventListener('click', (btn) => {
calculator.delete();
calculator.updateDisplay();
});
<div class="calculator">
<div class="calculation">
<div data-prev class="prev"></div>
<div data-current class="current"></div>
<!-- <div class="display">0</div> -->
</div>
<button class="bigger reset btn" data-reset>RES</button>
<button class="bigger delete btn" data-delete>DEL</button>
<button class="nr btn" data-number>1</button>
<button class="nr btn" data-number>2</button>
<button class="nr btn" data-number>3</button>
<button class="plus operator btn" data-key='plus' data-operator>+</button>
<button class="nr btn" data-number>4</button>
<button class="nr btn" data-number>5</button>
<button class="nr btn" data-number>6</button>
<button class="minus operator btn" data-key='minus' data-operator>-</button>
<button class="nr btn" data-number>7</button>
<button class="nr btn" data-number>8</button>
<button class="nr btn" data-number>9</button>
<button class="nr btn" data-number>0</button>
<button class="bigger equal btn" data-equal>=</button>
</div>
新更新
您还可以在 appendNumber
方法中添加以下条件。如果您首先选择任何运算符,这将调用 calculate
方法。
if(this.prev == '')
this.calculate();
关于JavaScript 计算器 - 允许负数作为第一个操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68851001/
赏金:对于提供代码以使此子程序与负数一起工作的任何人,+50 信誉点。 我编写了一个 MIPS 程序来将华氏温度转换为摄氏温度。它打开自己的输出窗口(即 UART)并正确显示摄氏值。它在从 C 调用到
我得到了以下代码 # On va convertir en somme monétaire # We convert our integer into a way to read money
我得到了以下代码 # On va convertir en somme monétaire # We convert our integer into a way to read money
我使用以下 RegEx 基本上过滤掉任何文本,并接受数字 + 运算符。 ([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9]+) 所以它抓取 1+
我有一个查询,它计算我在查询中使用 union all 的平均值,以便获取我最终使用 max 函数的数据。 当联合返回结果时,如下所示:- col 1 col2 1 0
我有这样一个类: public class SpiralGenerator implements Iterator> { private void generate(int pos, E...
A = numpy.matrix([[36, 34, 26], [18, 44, 1], [11, 31, 41]]) X1 = numpy.matrix([[462
我有一个应用程序,其中有一个显示硬币 00 的 TextView ,一个按钮显示奖励视频广告,为用户提供 10 个硬币,还有一个购买按钮,将硬币减少 30 个。现在,当用户有 30 个硬币时,单击购买
话不多少,直接附上代码实例,仅供参考 ? 1
我有一系列正数和负数,我想将每个数字的绝对值增加一个,同时仍保持正数/负数。0.2 -> 1.2-0.3 -> -1.3我怎样才能做到这一点? 最佳答案 让我们尝试使用numpysign s=pd.S
我有这段代码,只允许在 keypress() 的输入字段中输入数字 if (e.which != 8 && e.which != 0 && (e.which 57)) { return fa
我试图用“-1”作为所有值填充二维数组。我正在使用的代码是: int c [] []=new int[4][4]; Arrays.fill(c,-1) 这会引发以下错误: Exception in t
在学校作业中,我们应该编写一个程序,该程序接受一个数字并将其分为三个部分:1. 检查数字是正数还是负数2. 整数(大小)3.小数部分 要求是应该有一个自己的函数,名为separate,具有输入和输出参
有没有什么方法可以在 C# 中执行整数除法(没有 float 或小数,我需要保持这个非常快)来向下舍入数字? 默认除法只是丢弃分数参数。考虑: 1 / 2 = 0 // That is correc
我正在使用 matplotlib 为报告生成图表,并指定我自己的样式表来指定文本格式以符合报告的指定文档样式。在我的 .mplstyle 样式表中,我按如下方式指定字体系列: font.family
在 C++11 中,如果我们尝试使用全局运算符 new 分配负大小的数组,它会抛出 std::bad_array_new_length,但是 C++98/C++03 呢?是 UB 还是会抛出 std:
我试过 scanf("%u",&number) 并且我输入了负数问题是当我 printf("%d",number) 我得到负数。我认为这会阻止我读取负数。scanf("%d",&number) 和 s
我的任务是解释一些看似奇怪的C代码行为(在x86上运行)。我可以轻松完成所有其他工作,但是这确实让我感到困惑。 代码段1输出-2147483648 int a = 0x80000000; int
js有问题吗? if("hello".indexOf("world")) { // I forgot to add > -1 here console.log("hello world");
我正在尝试使用 Antlr 4 设置一个简单的计算器。 语法: grammar calcGrammar; input : expression EOF; expression : MINUS
我是一名优秀的程序员,十分优秀!