为什么负数在这个简单的HTML和JavaScript计算器中显示为”5-“而不是”-5″?

huangapple go评论96阅读模式
英文:

Why does negative numbers display like "5-" instead of "-5" in this simple calculator on HTML and javaScript?

问题

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width">
  6. <title>replit</title>
  7. <style>
  8. #calculator{
  9. display: flex;
  10. flex-direction: column;
  11. align-items: center;
  12. justify-content: center;
  13. max-width:400px;
  14. min-width: 300px;
  15. background-color: green;
  16. }
  17. #screen{
  18. width: 100%;
  19. aspect-ratio: 4/1.5;
  20. background-color: rgba(0, 0, 0, 0.8);
  21. }
  22. #input{
  23. width:90%;
  24. height:90%;
  25. background-color:rgba(0, 0, 0, 0);
  26. color:white;
  27. font-size: 15vw;
  28. direction: rtl;
  29. font-family: Helvetica, sans-serif;
  30. }
  31. #buttonsGrid{
  32. width: 100%;
  33. aspect-ratio: 4/5;
  34. display: grid;
  35. grid-template-columns: repeat(4, 1fr);
  36. grid-template-rows: repeat(5, 1fr);
  37. justify-content: center;
  38. font-size: 5vw;
  39. color:white;
  40. background-color: gray;
  41. font-family: Helvetica, sans-serif;
  42. }
  43. .singleButton{
  44. border: solid;
  45. border-color: black;
  46. border-width: 1px;
  47. display: flex;
  48. align-items: center;
  49. justify-content: center;
  50. }
  51. [id="0Button"] {
  52. grid-column: span 2;
  53. }
  54. #equalButton, #plusButton, #minusButton, #xButton, #divisionButton{
  55. background-color: orange;
  56. }
  57. #cButton, #negativePositiveButton, #percentageButton {
  58. background-color: rgba(0, 0, 0, 0.3);
  59. }
  60. </style>
  61. </head>
  62. <body>
  63. <h1>Simple calculator using JS</h1>
  64. <div id="calculator">
  65. <div id="screen">
  66. <input inputmode="numeric" id="input">
  67. </input>
  68. </div>
  69. <div id="buttonsGrid">
  70. <div id="cButton" class="singleButton">C
  71. </div>
  72. <div id="negativePositiveButton" class="singleButton">+/-
  73. </div>
  74. <div id="percentageButton" class="singleButton">%
  75. </div>
  76. <div id="divisionButton" class="singleButton">÷
  77. </div>
  78. <div id="7Button" class="singleButton numericButton">7</div>
  79. <div id="8Button" class="singleButton numericButton">8</div>
  80. <div id="9Button" class="singleButton numericButton">9</div>
  81. <div id="xButton" class="singleButton">x</div>
  82. <div id="4Button" class="singleButton numericButton">4</div>
  83. <div id="5Button" class="singleButton numericButton">5</div>
  84. <div id="6Button" class="singleButton numericButton">6</div>
  85. <div id="minusButton" class="singleButton">-</div>
  86. <div id="1Button" class="singleButton numericButton">1</div>
  87. <div id="2Button" class="singleButton numericButton">2</div>
  88. <div id="3Button" class="singleButton numericButton">3</div>
  89. <div id="plusButton" class="singleButton">+</div>
  90. <div id="0Button" class="singleButton numericButton">0</div>
  91. <div id="dotButton" class="singleButton numericButton">.</div>
  92. <div id="equalButton" class="singleButton">=</div>
  93. </div>
  94. </div>
  95. <script>
  96. const inputScreen = document.getElementById('input');
  97. const cButton = document.getElementById('cButton');
  98. const MoodButton = document.getElementById('negativePositiveButton');
  99. const percentageButton = document.getElementById('percentageButton');
  100. const divisionButton = document.getElementById('divisionButton');
  101. const xButton = document.getElementById('xButton');
  102. const minusButton = document.getElementById('minusButton');
  103. const plusButton = document.getElementById('plusButton');
  104. const equalButton = document.getElementById('equalButton');
  105. const numericButtonArr = [...document.getElementsByClassName('numericButton')];
  106. const operationButtonArr = [xButton, minusButton, plusButton];
  107. //button's events
  108. cButton.addEventListener('click', clearData);
  109. numericButtonArr.forEach(numericButton => {
  110. numericButton.addEventListener('click', displayNumbers);
  111. });
  112. operationButtonArr.forEach(operationButton => {
  113. operationButton.addEventListener('click', clearForSecondNumber);
  114. });
  115. divisionButton.addEventListener('click', handleDivision);
  116. MoodButton.addEventListener('click', changeMood);
  117. percentageButton.addEventListener('click', calculatePercentage);
  118. equalButton.addEventListener('click', performOperation);
  119. //variables
  120. let currentNumber = 0;
  121. let firstNumber = 0;
  122. let selectedOperation = '';
  123. let displayValue = '';
  124. let secondNumber = '';
  125. //Clear all data for C button press
  126. function clearData() {
  127. inputScreen.value = '';
  128. currentNumber = 0;
  129. displayValue = '';
  130. firstNumber = 0;
  131. selectedOperation = '';
  132. }
  133. //display numeric and dot buttons press on display
  134. function displayNumbers() {
  135. const value = this.textContent;
  136. if (value === '.') {
  137. // preventing dot duplication
  138. if (!displayValue.includes('.')) {
  139. displayValue += value;
  140. inputScreen.value = displayValue;
  141. }
  142. } else {
  143. displayValue += value;
  144. inputScreen.value = displayValue;
  145. }
  146. currentNumber = parseFloat(displayValue);
  147. }
  148. //convert - to + and + to-
  149. function changeMood(){
  150. currentNumber = currentNumber * (-1);
  151. displayValue = currentNumber;
  152. inputScreen.value = displayValue;
  153. }
  154. //Calculate %
  155. function calculatePercentage(){
  156. currentNumber = currentNumber / (100);
  157. displayValue = currentNumber;
  158. inputScreen.value = displayValue;
  159. }
  160. //for +,- and x. for division didnt work here :(
  161. function clearForSecondNumber() {
  162. selectedOperation = this.textContent;
  163. inputScreen.value = '';
  164. displayValue = '';
  165. firstNumber = currentNumber;
  166. }
  167. // Function to handle the division operation
  168. function handleDivision() {
  169. selectedOperation = '/';
  170. inputScreen.value = '';
  171. displayValue = '';
  172. firstNumber = currentNumber;
  173. }
  174. function performOperation() {
  175. secondNumber = currentNumber;
  176. let result;
  177. if (selectedOperation === 'x') {
  178. result = firstNumber * secondNumber;
  179. } else if (selectedOperation === '/') {
  180. result = firstNumber / secondNumber;
  181. } else if (selectedOperation === '-') {
  182. result = firstNumber - secondNumber;
  183. } else if (selectedOperation === '+') {
  184. result = firstNumber + secondNumber;
  185. }
  186. inputScreen.value = result;
  187. currentNumber = result;
  188. firstNumber = result;
  189. displayValue = '';
  190. <details>
  191. <summary>英文:</summary>
  192. I&#39;m learning to code, this is just an exercise. any operation resulting in negative number will display wrong, but console.logs will display right.
  193. why is that?

<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>replit</title>
<style>

#calculator{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
max-width:400px;
min-width: 300px;
background-color: green;
}

#screen{
width: 100%;
aspect-ratio: 4/1.5;
background-color: rgba(0, 0, 0, 0.8);
}

#input{
width:90%;
height:90%;
background-color:rgba(0, 0, 0, 0);
color:white;
font-size: 15vw;
direction: rtl;
font-family: Helvetica, sans-serif;
}

#buttonsGrid{
width: 100%;
aspect-ratio: 4/5;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(5, 1fr);
justify-content: center;
font-size: 5vw;
color:white;
background-color: gray;
font-family: Helvetica, sans-serif;
}

.singleButton{
border: solid;
border-color: black;
border-width: 1px;
display: flex;
align-items: center;
justify-content: center;

}

[id="0Button"] {
grid-column: span 2;
}

#equalButton, #plusButton, #minusButton, #xButton, #divisionButton{
background-color: orange;
}

#cButton, #negativePositiveButton, #percentageButton {
background-color: rgba(0, 0, 0, 0.3);
}

</style>

</head>

<body>

<h1>Simple calculator using JS</h1>

<div id="calculator">
<div id="screen">
<input inputmode="numeric" id="input">
</input>
</div>

  1. &lt;div id=&quot;buttonsGrid&quot;&gt;
  2. &lt;div id=&quot;cButton&quot; class=&quot;singleButton&quot;&gt;C
  3. &lt;/div&gt;
  4. &lt;div id=&quot;negativePositiveButton&quot; class=&quot;singleButton&quot;&gt;+/-
  5. &lt;/div&gt;
  6. &lt;div id=&quot;percentageButton&quot; class=&quot;singleButton&quot;&gt;%
  7. &lt;/div&gt;
  8. &lt;div id=&quot;divisionButton&quot; class=&quot;singleButton&quot;&gt;&#247;
  9. &lt;/div&gt;
  10. &lt;div id=&quot;7Button&quot; class=&quot;singleButton numericButton&quot;&gt;7&lt;/div&gt;
  11. &lt;div id=&quot;8Button&quot; class=&quot;singleButton numericButton&quot;&gt;8&lt;/div&gt;
  12. &lt;div id=&quot;9Button&quot; class=&quot;singleButton numericButton&quot;&gt;9&lt;/div&gt;
  13. &lt;div id=&quot;xButton&quot; class=&quot;singleButton&quot;&gt;x&lt;/div&gt;
  14. &lt;div id=&quot;4Button&quot; class=&quot;singleButton numericButton&quot;&gt;4&lt;/div&gt;
  15. &lt;div id=&quot;5Button&quot; class=&quot;singleButton numericButton&quot;&gt;5&lt;/div&gt;
  16. &lt;div id=&quot;6Button&quot; class=&quot;singleButton numericButton&quot;&gt;6&lt;/div&gt;
  17. &lt;div id=&quot;minusButton&quot; class=&quot;singleButton&quot;&gt;-&lt;/div&gt;
  18. &lt;div id=&quot;1Button&quot; class=&quot;singleButton numericButton&quot;&gt;1&lt;/div&gt;
  19. &lt;div id=&quot;2Button&quot; class=&quot;singleButton numericButton&quot;&gt;2&lt;/div&gt;
  20. &lt;div id=&quot;3Button&quot; class=&quot;singleButton numericButton&quot;&gt;3&lt;/div&gt;
  21. &lt;div id=&quot;plusButton&quot; class=&quot;singleButton&quot;&gt;+&lt;/div&gt;
  22. &lt;div id=&quot;0Button&quot; class=&quot;singleButton numericButton&quot;&gt;0&lt;/div&gt;
  23. &lt;div id=&quot;dotButton&quot; class=&quot;singleButton numericButton&quot;&gt;.&lt;/div&gt;
  24. &lt;div id=&quot;equalButton&quot; class=&quot;singleButton&quot;&gt;=&lt;/div&gt;
  25. &lt;/div&gt;

</div>

<script >

const inputScreen = document.getElementById('input');

const cButton = document.getElementById('cButton');
const MoodButton = document.getElementById('negativePositiveButton');
const percentageButton = document.getElementById('percentageButton');

const divisionButton = document.getElementById('divisionButton');
const xButton = document.getElementById('xButton');
const minusButton = document.getElementById('minusButton');
const plusButton = document.getElementById('plusButton');
const equalButton = document.getElementById('equalButton');

const numericButtonArr = [...document.getElementsByClassName('numericButton')];
const operationButtonArr = [xButton, minusButton, plusButton];

//button's events
cButton.addEventListener('click', clearData);
numericButtonArr.forEach(numericButton => {
numericButton.addEventListener('click', displayNumbers);
});
operationButtonArr.forEach(operationButton => {
operationButton.addEventListener('click', clearForSecondNumber);
});
divisionButton.addEventListener('click', handleDivision);
MoodButton.addEventListener('click', changeMood);
percentageButton.addEventListener('click', calculatePercentage);
equalButton.addEventListener('click', performOperation);

//variables
let currentNumber = 0;
let firstNumber = 0;
let selectedOperation = '';
let displayValue = '';

let secondNumber = '';

//Clear all data for C button press
function clearData() {
inputScreen.value = '';
currentNumber = 0;
displayValue = '';
firstNumber = 0;
selectedOperation = '';
}

//display numeric and dot buttons press on display
function displayNumbers() {
const value = this.textContent;

  1. if (value === &#39;.&#39;) {
  2. // preventing dot duplication
  3. if (!displayValue.includes(&#39;.&#39;)) {
  4. displayValue += value;
  5. inputScreen.value = displayValue;
  6. }
  7. } else {
  8. displayValue += value;
  9. inputScreen.value = displayValue;
  10. }
  11. currentNumber = parseFloat(displayValue);

}

//convert - to + and + to-
function changeMood(){
currentNumber = currentNumber * (-1);
displayValue = currentNumber;
inputScreen.value = displayValue;
}

//Calculate %
function calculatePercentage(){
currentNumber = currentNumber / (100);
displayValue = currentNumber;
inputScreen.value = displayValue;
}

//for +,- and x. for division didnt work here 为什么负数在这个简单的HTML和JavaScript计算器中显示为”5-“而不是”-5″?
function clearForSecondNumber() {
selectedOperation = this.textContent;
inputScreen.value = '';
displayValue = '';
firstNumber = currentNumber;
}

// Function to handle the division operation
function handleDivision() {
selectedOperation = '/';
inputScreen.value = '';
displayValue = '';
firstNumber = currentNumber;
}

function performOperation() {
secondNumber = currentNumber;
let result;

  1. if (selectedOperation === &#39;x&#39;) {
  2. result = firstNumber * secondNumber;
  3. } else if (selectedOperation === &#39;/&#39;) {
  4. result = firstNumber / secondNumber;
  5. } else if (selectedOperation === &#39;-&#39;) {
  6. result = firstNumber - secondNumber;
  7. } else if (selectedOperation === &#39;+&#39;) {
  8. result = firstNumber + secondNumber;
  9. }
  10. inputScreen.value = result;
  11. currentNumber = result;
  12. firstNumber = result;
  13. displayValue = &#39;&#39;;

}

</script>

</body>

</html>

  1. </details>
  2. # 答案1
  3. **得分**: 8
  4. 因为您通过设置 `direction: rtl;` 将书写方向设置为从右到左(RTL),这对像阿拉伯语这样的语言是有道理的。
  5. 也许您只是想将文本右对齐(而不是改变其方向),在这种情况下,您需要使用 `text-align: right;`。
  6. <details>
  7. <summary>英文:</summary>
  8. Because you set the writing direction to RTL (right-to-left) by setting `direction: rtl;`. This makes sense for languages like Arabic.
  9. Perhaps you wanted to simply right-align the text (without reversing its direction), in this case you need `text-align: right;`.
  10. </details>

huangapple
  • 本文由 发表于 2023年7月5日 01:10:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/76614697.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定