如何在 Javascript 中将两个数字连接成一个 Stack
How to concatenate two numbers into a Stack in Javascript
所以如果为真,我想连接两个数字。例如,如果用户单击了按钮编号“2”和按钮编号“3”,那么它应该作为 ["23"] 而不是 ["2", "3"] 存储在 Stack 中。无论是 23 还是只有 2,每当您点击运算符(“+”、“-”、“*”、“/”、“=”)时,您都应该点击第二个数字。它适用于 Javascript.
中的计算器
示例:
用户点击 23、+、7,然后点击 =。那应该在堆栈中存储为 ["23", "+", "7", "="],希望你明白了。
已更新
var stack = new Array();
for (let i = 0; i < length; i++)
{
buttons[i].addEventListener("click", handle);
}
var prevop = '';
function handle(event)
{
const value = event.target.value;
var myFirstInput =+ value;
我被困在这里。
if(prevop == '+' || prevop == '-' || prevop == '*' ||prevop == '/')
{
var mySecondInput =+ value;
var input = "" + myFirstInput + myFirstInput;
stack.push(input);
}
if (prevop == '=') {
document.getElementById("textfield").value = "";
}
prevop = value;
switch(value)
{
case "+":
console.log("+ was clicked");
document.getElementById("textfield").value += value;
break;
case "-":
console.log("- was clicked");
document.getElementById("textfield").value += value;
break;
case "*":
console.log("* was clicked");
document.getElementById("textfield").value += value;
break;
case "/":
console.log("/ was clicked");
document.getElementById("textfield").value += value;
break;
case "=":
var tmp = eval(document.getElementById("textfield").value);
document.getElementById("textfield").value += value + tmp;
break;
default:
console.log("%s was clicked", value);
document.getElementById("textfield").value += value;
}
}
没有代码有点难以回答,但据我了解你的问题,我的建议是:
只要您的计算器的 + 号没有点击,您就可以将您的 "strings numbers" 与 + 号(不是您计算器的 + 号)连接起来。
数组第一个元素的示例:
"2" + "3" // "23" when 2 and 3 are clicked
通过这样做,您可以继续向数组的第一个元素添加字符串。
然后当您的计算器或任何其他计算符号的 + 符号被点击时,您将“+”(或被点击的符号)作为字符串添加到您的数组中;在索引 1。
这样,数组的前 2 个元素将是 ["23", "+"]
您可以使用一种逻辑来检查数组索引 1 处的元素是否与“+”、“-”、“*”或“/”匹配。如果尚未选择,您可以继续将数字添加到索引 0。
只要索引 3 不等于 =
,索引 2 也一样。
这就是我的理解你想做的。这有意义吗?
归根结底,如果您想 return 结果,您可以将所有内容存储为字符串,而不必担心将其设为数组(除非您想跟踪输入的内容单独的元素)。以下是计算结果的方法:
function mathEval(mathString) { // this hack evaluates your math function and immediately returns a result.
return new Function('return ' + mathString)();
}
console.log(mathEval("23+7")); // 30. You can trigger the eval when the = sign is clicked
您可以检查keyvalue是否为数字,并据此做出选择:
let fooArray = ["2", "3", "+", "7", "=" ]
function testFunction(keyVal) {
let someArray = [];
fooArray.forEach((f, i) => {
if (i != 0) {
let toBeInserted = fooArray[i - 1];
if ( isNumeric(f) && isNumeric(toBeInserted)) {
someArray.push(`${toBeInserted}${f}`);
} else {
someArray.push(f);
}
} else {
someArray.push(f);
}
});
return someArray;
}
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
console.log(testFunction(fooArray));
我实现了最小值 "calculator",它将按照您的描述进行堆栈操作。
https://jsbin.com/maberic/5/edit?html,js,output
window.onload = function() {
var stack = [];
var inputField = document.querySelector('#textfield');
var buttons = [];
var buttonsContainer = document.querySelector('#buttons');
var actions = {
'add': '+',
'sub': '-',
'mul': '*',
'div': '/' // you can use custom symbols e.g. "÷" U+00F7 Division Sign Unicode Character
};
var buttonsHandler = function(event) {
var button = event.target;
var action = button.getAttribute('action');
switch (action) {
case 'input':
var value = button.getAttribute('value');
if (stack.length <= 0 || isNaN(parseInt(stack[stack.length - 1], 10))) {
// if empty stack or last is sign we can just push
stack.push(value)
} else {
// else we need to concat last *number*
stack[stack.length - 1] += '' + value; // make sure we have a string
}
inputField.value += value;
break;
case 'action':
var op = button.getAttribute('op');
switch (op) {
case 'bs':
// implement here backspace logic
// e.g. remove last char from number or remove operator entirely
break;
case 'eq':
// implement here logic for "=" button
// avoid using eval: https://medium.com/mail-online/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
break;
case 'cl':
stack = [];
inputField.value = '';
break;
default:
stack.push(actions[op]);
inputField.value += actions[op];
break;
}
break;
default:
break;
}
// here you can apply "post" actions for your stack
};
/* Buttons "generator" */
[ {type: 'input', value: 1 },
{type: 'input', value: 2 },
{type: 'input', value: 3 },
{type: 'linebreak' },
{type: 'input', value: 4 },
{type: 'input', value: 5 },
{type: 'input', value: 6 },
{type: 'linebreak' },
{type: 'input', value: 7 },
{type: 'input', value: 8 },
{type: 'input', value: 9 },
{type: 'linebreak' },
{type: 'dummy' },
{type: 'input', value: 0 },
{type: 'dummy' },
{type: 'linebreak' },
{type: 'action', sign: actions.add, action: 'add'},
{type: 'action', sign: actions.sub, action: 'sub'},
{type: 'linebreak' },
{type: 'action', sign: actions.mul, action: 'mul'},
{type: 'action', sign: actions.div, action: 'div'},
{type: 'linebreak' },
{type: 'action', sign: '=', action: 'eq'},
{type: 'linebreak' },
{type: 'action', sign: '< Backspace', action: 'bs'},
{type: 'action', sign: 'Clear', action: 'cl'} ]
.forEach(function(elem) {
switch(elem.type) {
case 'input':
var button = document.createElement('button');
button.innerText = elem.value.toString();
button.setAttribute('action', 'input');
button.setAttribute('value', elem.value);
button.onclick = buttonsHandler;
buttonsContainer.append(button);
buttons.push(button);
break;
case 'dummy':
var dummy = document.createElement('button');
dummy.innerText = '_';
buttonsContainer.append(dummy);
break;
case 'action':
var action = document.createElement('button');
action.innerText = elem.sign.toString();
action.setAttribute('action', 'action');
action.setAttribute('op', elem.action);
action.onclick = buttonsHandler;
buttonsContainer.append(action);
buttons.push(button);
break;
case 'linebreak':
var br = document.createElement('br');
buttonsContainer.append(br);
break;
default:
break;
}
});
/* end */
}
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Simple calc template">
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width"/>
<title>Example</title>
</head>
<body>
<input id="textfield" type="text" readonly="readonly"/>
<br/>
<div id="buttons"></div>
</body>
</html>
此外,我建议您不要使用 eval:https://medium.com/@epoberezkin/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
您可以使用您的堆栈。但是你需要记住乘法、除法等操作的顺序。
所以如果为真,我想连接两个数字。例如,如果用户单击了按钮编号“2”和按钮编号“3”,那么它应该作为 ["23"] 而不是 ["2", "3"] 存储在 Stack 中。无论是 23 还是只有 2,每当您点击运算符(“+”、“-”、“*”、“/”、“=”)时,您都应该点击第二个数字。它适用于 Javascript.
中的计算器示例: 用户点击 23、+、7,然后点击 =。那应该在堆栈中存储为 ["23", "+", "7", "="],希望你明白了。
已更新
var stack = new Array();
for (let i = 0; i < length; i++)
{
buttons[i].addEventListener("click", handle);
}
var prevop = '';
function handle(event)
{
const value = event.target.value;
var myFirstInput =+ value;
我被困在这里。
if(prevop == '+' || prevop == '-' || prevop == '*' ||prevop == '/')
{
var mySecondInput =+ value;
var input = "" + myFirstInput + myFirstInput;
stack.push(input);
}
if (prevop == '=') {
document.getElementById("textfield").value = "";
}
prevop = value;
switch(value)
{
case "+":
console.log("+ was clicked");
document.getElementById("textfield").value += value;
break;
case "-":
console.log("- was clicked");
document.getElementById("textfield").value += value;
break;
case "*":
console.log("* was clicked");
document.getElementById("textfield").value += value;
break;
case "/":
console.log("/ was clicked");
document.getElementById("textfield").value += value;
break;
case "=":
var tmp = eval(document.getElementById("textfield").value);
document.getElementById("textfield").value += value + tmp;
break;
default:
console.log("%s was clicked", value);
document.getElementById("textfield").value += value;
}
}
没有代码有点难以回答,但据我了解你的问题,我的建议是:
只要您的计算器的 + 号没有点击,您就可以将您的 "strings numbers" 与 + 号(不是您计算器的 + 号)连接起来。
数组第一个元素的示例:
"2" + "3" // "23" when 2 and 3 are clicked
通过这样做,您可以继续向数组的第一个元素添加字符串。
然后当您的计算器或任何其他计算符号的 + 符号被点击时,您将“+”(或被点击的符号)作为字符串添加到您的数组中;在索引 1。
这样,数组的前 2 个元素将是 ["23", "+"]
您可以使用一种逻辑来检查数组索引 1 处的元素是否与“+”、“-”、“*”或“/”匹配。如果尚未选择,您可以继续将数字添加到索引 0。
只要索引 3 不等于 =
,索引 2 也一样。
这就是我的理解你想做的。这有意义吗?
归根结底,如果您想 return 结果,您可以将所有内容存储为字符串,而不必担心将其设为数组(除非您想跟踪输入的内容单独的元素)。以下是计算结果的方法:
function mathEval(mathString) { // this hack evaluates your math function and immediately returns a result.
return new Function('return ' + mathString)();
}
console.log(mathEval("23+7")); // 30. You can trigger the eval when the = sign is clicked
您可以检查keyvalue是否为数字,并据此做出选择:
let fooArray = ["2", "3", "+", "7", "=" ]
function testFunction(keyVal) {
let someArray = [];
fooArray.forEach((f, i) => {
if (i != 0) {
let toBeInserted = fooArray[i - 1];
if ( isNumeric(f) && isNumeric(toBeInserted)) {
someArray.push(`${toBeInserted}${f}`);
} else {
someArray.push(f);
}
} else {
someArray.push(f);
}
});
return someArray;
}
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
console.log(testFunction(fooArray));
我实现了最小值 "calculator",它将按照您的描述进行堆栈操作。
https://jsbin.com/maberic/5/edit?html,js,output
window.onload = function() {
var stack = [];
var inputField = document.querySelector('#textfield');
var buttons = [];
var buttonsContainer = document.querySelector('#buttons');
var actions = {
'add': '+',
'sub': '-',
'mul': '*',
'div': '/' // you can use custom symbols e.g. "÷" U+00F7 Division Sign Unicode Character
};
var buttonsHandler = function(event) {
var button = event.target;
var action = button.getAttribute('action');
switch (action) {
case 'input':
var value = button.getAttribute('value');
if (stack.length <= 0 || isNaN(parseInt(stack[stack.length - 1], 10))) {
// if empty stack or last is sign we can just push
stack.push(value)
} else {
// else we need to concat last *number*
stack[stack.length - 1] += '' + value; // make sure we have a string
}
inputField.value += value;
break;
case 'action':
var op = button.getAttribute('op');
switch (op) {
case 'bs':
// implement here backspace logic
// e.g. remove last char from number or remove operator entirely
break;
case 'eq':
// implement here logic for "=" button
// avoid using eval: https://medium.com/mail-online/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
break;
case 'cl':
stack = [];
inputField.value = '';
break;
default:
stack.push(actions[op]);
inputField.value += actions[op];
break;
}
break;
default:
break;
}
// here you can apply "post" actions for your stack
};
/* Buttons "generator" */
[ {type: 'input', value: 1 },
{type: 'input', value: 2 },
{type: 'input', value: 3 },
{type: 'linebreak' },
{type: 'input', value: 4 },
{type: 'input', value: 5 },
{type: 'input', value: 6 },
{type: 'linebreak' },
{type: 'input', value: 7 },
{type: 'input', value: 8 },
{type: 'input', value: 9 },
{type: 'linebreak' },
{type: 'dummy' },
{type: 'input', value: 0 },
{type: 'dummy' },
{type: 'linebreak' },
{type: 'action', sign: actions.add, action: 'add'},
{type: 'action', sign: actions.sub, action: 'sub'},
{type: 'linebreak' },
{type: 'action', sign: actions.mul, action: 'mul'},
{type: 'action', sign: actions.div, action: 'div'},
{type: 'linebreak' },
{type: 'action', sign: '=', action: 'eq'},
{type: 'linebreak' },
{type: 'action', sign: '< Backspace', action: 'bs'},
{type: 'action', sign: 'Clear', action: 'cl'} ]
.forEach(function(elem) {
switch(elem.type) {
case 'input':
var button = document.createElement('button');
button.innerText = elem.value.toString();
button.setAttribute('action', 'input');
button.setAttribute('value', elem.value);
button.onclick = buttonsHandler;
buttonsContainer.append(button);
buttons.push(button);
break;
case 'dummy':
var dummy = document.createElement('button');
dummy.innerText = '_';
buttonsContainer.append(dummy);
break;
case 'action':
var action = document.createElement('button');
action.innerText = elem.sign.toString();
action.setAttribute('action', 'action');
action.setAttribute('op', elem.action);
action.onclick = buttonsHandler;
buttonsContainer.append(action);
buttons.push(button);
break;
case 'linebreak':
var br = document.createElement('br');
buttonsContainer.append(br);
break;
default:
break;
}
});
/* end */
}
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Simple calc template">
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width"/>
<title>Example</title>
</head>
<body>
<input id="textfield" type="text" readonly="readonly"/>
<br/>
<div id="buttons"></div>
</body>
</html>
此外,我建议您不要使用 eval:https://medium.com/@epoberezkin/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
您可以使用您的堆栈。但是你需要记住乘法、除法等操作的顺序。