This calculator is using the ANTLR4 TypeScript target to calculate results from formulas that are passed in as string. Both JavaScript and TypeScript are supported.
Whenever a calculation is performed, a CalculationResult
is returned with the following properties:
Property | Type | |
---|---|---|
isValid | boolean | true if the formula could be parsed and calculated, else false |
errorPosition | number | Position of the offending symbol in the line, 0 based index, for invalid results, else null |
errorMessage | string | ANTLR error message for invalid formulas, else null |
result | number | NaN for invalid formulas, else the actual result |
You can check out the live demo here!
You can find the .NET version here: https://github.com/GeorgDangl/Dangl.Calculator
Clone this repository or just go with npm install antlr-calculator
.
Just reference dist/bundle.js
and the global variable antlrCalc
is available.
var result = antlrCalc.Calculator.calculate('4*5');
console.log(JSON.stringify(result, null, 2));
// {
// "isValid": true,
// "errorPosition": null,
// "errorMessage": null,
// "result": 20
// }
Import the Calculator
class and use the static calculate(formula: string)
method to evaluate formulas.
import { Calculator } from 'antlr-calculator';
var result = Calculator.calculate('4*5');
console.log(JSON.stringify(result, null, 2));
// {
// "isValid": true,
// "errorPosition": null,
// "errorMessage": null,
// "result": 20
// }
| Expression | |
| ------------------------------------------- | --------------------------------------------------------------- | ----------------------------- |
| FLOOR expression
| Round down to zero accuracy |
| CEIL expression
| Round up to zero accuracy |
| ABS expression
| Absolute value |
| ROUNDK '(' expression ';' expression ')'
| Round expr_1 with expr_2 accuracy |
| ROUND expression
| Round with zero accuracy |
| TRUNC expression
| Trim decimal digits |
| SIN expression
| Sinus |
| COS expression
| Cosinus |
| TAN expression
| Tangens |
| COT expression
| Cotangens |
| SINH expression
| Sinus Hypererbolicus |
| COSH expression
| Cosinus Hyperbolicus |
| TANH expression
| Tangens Hyperbolicus |
| ARCSIN expression
| Inverse Sinus |
| ARCCOS expression
| Inverse Cosinus |
| ARCTAN expression
| Inverse Tangens |
| ARCTAN2 '(' expression ';' expression ')'
| Atan2 |
| ARCCOT expression
| Inverse Cotangens |
| EXP expression
| e ^ expr |
| LN expression
| Logarithm to e |
| EEX expression
| 10 ^ expr |
| LOG expression
| Logarithm to 10 |
| RAD expression
| Angle to radians (360° base) |
| DEG expression
| Radians to angle (360° base) |
| SQRT expression
| Square root |
| SQR expression
| Square product |
| expression op = ('^' | '\*\*') expression
| expr_1 to the expr_2 th power |
| expression (MOD | '%' ) expression
| Modulo |
| expression DIV expression
| Whole part of division rest |
| expression op = ('~' | '//') expression
| expr_1 nth root of expr_2 |
| expression op = ('\*' | '/') expression
| Multiplication or division |
| expression op = ('+' | '-') expression
| Addition or subtraction |
| NUMBER
| Single integer or float number |
| '(' expression ')'
| Expression within parentheses |
| MIN '(' expression (';' expression)* ')'
| Minimum |
| MAX '(' expression (';' expression)* ')'
| Maximum |
| PI '()'?
| Mathematical constant pi = 3,141593 |
| expression E+ expression
| Exponent, e.g. 10e+43 |
| expression E- expression
| Inverted Exponent, e.g. 10e-43 |
| EULER
| Mathematical constant e = 2,718282 |
| '-' expression
| Unary minus sign (negative numbers) |
| '+' expression
| Unary plus sign (positive numbers) |
| '(' expression ')' expression
| Expressions without multiplication sign, e.g. 2(3)
-> 2*(3)
|
| expression '(' expression ')'
| Expressions without multiplication sign, e.g. 2(3)
-> 2*(3)
|
expression may be any expression as functions can be nested. Example: DEG(2*PI)
or LOG(10^3)
.
Formulas can be case invariant, e.g. SIN
, sin
and siN
are all considered the same.
Comments in Formulas are supported by encapsulating them either in /*...*/
, '...'
or "..."
quote styles. Examples:
4/*Length*/*3/*Width*/
resolves to 12
4'Length'*3'Width'
resolves to 12
4"Length"*3"Width"
resolves to 12
The calculator can be called with an overload that accepts a callback function for substitution values. For example, take the following formula:
1,2*#Z4+3
Here, #Z4
is a substitution, which is a placeholder that can be externally supplied. Let's say you want to resolve #Z4
to the value three, you could make this simple call:
const formula = '1,2*#Z4+3';
const result = Calculator.calculate(formula, (substitution) => {
if (substitution === '#Z4') {
return 3;
}
return null;
});
The callback is in the form of a (substitution: string) => number
, and it will be called for every substitution found in the formula. Multiple substitutions are supported. If duplicates in substitutions are present, the calculator will request each one individually. If a substitution resolves to null
, the formula is considered invalid.
Substitutions must always start with the #
character and can then have the following characters: [a-z] | [A-Z] | [äÄöÖüÜ] | [0-9]
Formulas may be terminated with a semicolon ;
at the end, followed by extra input that is not evaluated. This is useful when, instead of regular comments, you
just want to attach some trailing formation at the end of a formula. For example, the following formula:
1 + 3; As per our counting
Would just evaluate the 1 + 3
portion and return a valid result with the value 4
, ignoring the trailing semicolon and all input that follows.