-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add calculation functionality to calculator #4
Merged
Merged
Changes from 2 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
7f7f387
add files and big.js dependency
tiagomarin f5cb4a7
add calculation functionality to the calculator
tiagomarin 66d83cc
add dysplay function and new styling & fix error
tiagomarin ef7d6e3
delete unused images
tiagomarin d3d8910
fix stylelint errors
tiagomarin File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
import operate from './operate'; | ||
|
||
function isNumber(item) { | ||
return !!item.match(/[0-9]+/); | ||
} | ||
|
||
/** | ||
* Given a button name and a calculator data object, return an updated | ||
* calculator data object. | ||
* | ||
* Calculator data object contains: | ||
* total:s the running total | ||
* next:String the next number to be operated on with the total | ||
* operation:String +, -, etc. | ||
*/ | ||
export default function calculate(obj, buttonName) { | ||
if (buttonName === 'AC') { | ||
return { | ||
total: null, | ||
next: null, | ||
operation: null, | ||
}; | ||
} | ||
|
||
if (isNumber(buttonName)) { | ||
if (buttonName === '0' && obj.next === '0') { | ||
return {}; | ||
} | ||
// If there is an operation, update next | ||
if (obj.operation) { | ||
if (obj.next && obj.next !== '0') { | ||
return { ...obj, next: obj.next + buttonName }; | ||
} | ||
return { ...obj, next: buttonName }; | ||
} | ||
// If there is no operation, update next and clear the value | ||
if (obj.next && obj.next !== '0') { | ||
return { | ||
next: obj.next + buttonName, | ||
total: null, | ||
}; | ||
} | ||
return { | ||
next: buttonName, | ||
total: null, | ||
}; | ||
} | ||
|
||
if (buttonName === '.') { | ||
if (obj.next) { | ||
if (obj.next.includes('.')) { | ||
return { ...obj }; | ||
} | ||
return { ...obj, next: `${obj.next}.` }; | ||
} | ||
if (obj.operation) { | ||
return { ...obj, next: '0.' }; | ||
} | ||
if (obj.total) { | ||
if (obj.total.includes('.')) { | ||
return {}; | ||
} | ||
return { ...obj, next: `${obj.total}.` }; | ||
} | ||
return { ...obj, next: '0.' }; | ||
} | ||
|
||
if (buttonName === '=') { | ||
if (obj.next && obj.operation) { | ||
return { | ||
total: operate(obj.total, obj.next, obj.operation), | ||
next: null, | ||
operation: null, | ||
}; | ||
} | ||
// '=' with no operation, nothing to do | ||
return {}; | ||
} | ||
|
||
if (buttonName === '+/-') { | ||
if (obj.next) { | ||
return { ...obj, next: (-1 * parseFloat(obj.next)).toString() }; | ||
} | ||
if (obj.total) { | ||
return { ...obj, total: (-1 * parseFloat(obj.total)).toString() }; | ||
} | ||
return {}; | ||
} | ||
|
||
// Button must be an operation | ||
|
||
// When the user presses an operation button without having entered | ||
// a number first, do nothing. | ||
// if (!obj.next && !obj.total) { | ||
// return {}; | ||
// } | ||
|
||
// User pressed an operation after pressing '=' | ||
if (!obj.next && obj.total && !obj.operation) { | ||
return { ...obj, operation: buttonName }; | ||
} | ||
|
||
// User pressed an operation button and there is an existing operation | ||
if (obj.operation) { | ||
if (obj.total && !obj.next) { | ||
return { ...obj, operation: buttonName }; | ||
} | ||
|
||
if (!obj.total) { | ||
return { total: 0, operation: buttonName }; | ||
} | ||
|
||
return { | ||
total: operate(obj.total, obj.next, obj.operation), | ||
next: null, | ||
operation: buttonName, | ||
}; | ||
} | ||
|
||
// no operation yet, but the user typed one | ||
|
||
// The user hasn't typed a number yet, just save the operation | ||
if (!obj.next) { | ||
return { operation: buttonName }; | ||
} | ||
|
||
// save the operation and shift 'next' into 'total' | ||
return { | ||
total: obj.next, | ||
next: null, | ||
operation: buttonName, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
import Big from 'big.js'; | ||
|
||
export default function operate(numberOne, numberTwo, operation) { | ||
const one = Big(numberOne); | ||
const two = Big(numberTwo); | ||
if (operation === '+') { | ||
return one.plus(two).toString(); | ||
} | ||
if (operation === '-') { | ||
return one.minus(two).toString(); | ||
} | ||
if (operation === 'x') { | ||
return one.times(two).toString(); | ||
} | ||
if (operation === '÷') { | ||
try { | ||
return one.div(two).toString(); | ||
} catch (err) { | ||
return "Can't divide by 0."; | ||
} | ||
} | ||
if (operation === '%') { | ||
try { | ||
return one.mod(two).toString(); | ||
} catch (err) { | ||
return "Can't find modulo as can't divide by 0."; | ||
} | ||
} | ||
throw Error(`Unknown operation '${operation}'`); | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good job so far with your project implementation it is great 👍 But I can't perform "AC" operation I'm getting errors 😢 , Please fix it in order to make your calculator works as expected 😄
One more thing I'm getting the error in the console "You provided a value prop to a form field without an onChange handler" this error occurs generally when we set a value prop on a field that has no onChange handler. I suggest you use the defaultValue prop or set an onChange prop on the field. Please fix it to make your project completed. 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@codecaiine Thanks a lot for your time!